C#中,偶给ComboBox在Load事件中绑定了数据集,然后借助DrawItem和MeasureItem更改了ComboBox的ItemHeight,这个高度成功更改了,可是窗体中ComboxBox不能正常显示文本,请教各位高手该如何解决。
附: private void FormStuAdd_Load(object sender, EventArgs e)
        {
            //绑定专业信息
            #region;
            Db myDb = new Db();
            SqlConnection myDbConnection = myDb.DbOpen();
            string sqlStr = "select id,name from [xj_zhuanye]";
            SqlDataAdapter adp = new SqlDataAdapter(sqlStr,myDbConnection);
            DataSet ds = new DataSet();
            adp.Fill(ds);
            
            cbZhuanYe.DataSource = ds.Tables[0].DefaultView;
            cbZhuanYe.DisplayMember = "name";
            cbZhuanYe.ValueMember = "id";
            myDb.DbClose(myDbConnection);
            #endregion;
        }private void cbZhuanYe_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            
            StringFormat strFmt = new System.Drawing.StringFormat();
            strFmt.Alignment = StringAlignment.Center; //文本垂直居中
            //strFmt.LineAlignment = StringAlignment.Center; //文本水平居中
           e.Graphics.DrawString(cbZhuanYe.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds, strFmt);
            e.DrawFocusRectangle();
        }        private void cbZhuanYe_MeasureItem(object sender, MeasureItemEventArgs e)
        {
            e.ItemHeight = 22;
        }

解决方案 »

  1.   

     internal System.Windows.Forms.ComboBox ComboBox1;
        private string[] animals;    // This method initializes the owner-drawn combo box.
        // The drop-down width is set much wider than the size of the combo box
        // to accomodate the large items in the list.  The drop-down style is set to 
        // ComboBox.DropDown, which requires the user to click on the arrow to 
        // see the list.
        private void InitializeComboBox()
        {
            this.ComboBox1 = new ComboBox();
            this.ComboBox1.DrawMode = 
                System.Windows.Forms.DrawMode.OwnerDrawVariable;
            this.ComboBox1.Location = new System.Drawing.Point(10, 20);
            this.ComboBox1.Name = "ComboBox1";
            this.ComboBox1.Size = new System.Drawing.Size(100, 120);
            this.ComboBox1.DropDownWidth = 250;
            this.ComboBox1.TabIndex = 0;
            this.ComboBox1.DropDownStyle = ComboBoxStyle.DropDown;
            animals = new string[]{"Elephant", "c r o c o d i l e", "lion"};
            ComboBox1.DataSource = animals;
            this.Controls.Add(this.ComboBox1);        // Hook up the MeasureItem and DrawItem events
            this.ComboBox1.DrawItem += 
                new DrawItemEventHandler(ComboBox1_DrawItem);
            this.ComboBox1.MeasureItem += 
                new MeasureItemEventHandler(ComboBox1_MeasureItem);
        }    // If you set the Draw property to DrawMode.OwnerDrawVariable, 
        // you must handle the MeasureItem event. This event handler 
        // will set the height and width of each item before it is drawn. 
        private void ComboBox1_MeasureItem(object sender, 
            System.Windows.Forms.MeasureItemEventArgs e)
        {        switch(e.Index)
            {
                case 0:
                    e.ItemHeight = 45;
                    break;
                case 1:
                    e.ItemHeight = 20;
                    break;
                case 2:
                    e.ItemHeight = 35;
                    break;
            }
            e.ItemWidth = 260;    }    // You must handle the DrawItem event for owner-drawn combo boxes.  
        // This event handler changes the color, size and font of an 
        // item based on its position in the array.
        private void ComboBox1_DrawItem(object sender, 
            System.Windows.Forms.DrawItemEventArgs e)
        {        float size = 0;
            System.Drawing.Font myFont;
            FontFamily family = null;        System.Drawing.Color animalColor = new System.Drawing.Color();
            switch(e.Index)
            {
                case 0:
                    size = 30;
                    animalColor = System.Drawing.Color.Gray;
                    family = FontFamily.GenericSansSerif;
                    break;
                case 1:
                    size = 10;
                    animalColor = System.Drawing.Color.LawnGreen;
                    family = FontFamily.GenericMonospace;
                    break;
                case 2:
                    size = 15;
                    animalColor = System.Drawing.Color.Tan;
                    family = FontFamily.GenericSansSerif;
                    break;
            }        // Draw the background of the item.
            e.DrawBackground();        // Create a square filled with the animals color. Vary the size
            // of the rectangle based on the length of the animals name.
            Rectangle rectangle = new Rectangle(2, e.Bounds.Top+2, 
                    e.Bounds.Height, e.Bounds.Height-4);
            e.Graphics.FillRectangle(new SolidBrush(animalColor), rectangle);        // Draw each string in the array, using a different size, color,
            // and font for each item.
            myFont = new Font(family, size, FontStyle.Bold);
            e.Graphics.DrawString(animals[e.Index], myFont, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X+rectangle.Width, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));        // Draw the focus rectangle if the mouse hovers over an item.
            e.DrawFocusRectangle();
        }看例题
      

  2.   

    不知道二楼从哪里COPY这段代码的,麻烦你不要答非所问,谢谢合作。
      

  3.   

      myFont = new Font(family, 22, FontStyle.Bold);
     e.Graphics.DrawString(cbZhuanYe.Items[e.Index].ToString(), myFont, new SolidBrush(e.ForeColor), e.Bounds, strFmt); // Draw each string in the array, using a different size, color,
            // and font for each item.
            myFont = new Font(family, size, FontStyle.Bold);
            e.Graphics.DrawString(animals[e.Index], myFont, System.Drawing.Brushes.Black, new RectangleF(e.Bounds.X+rectangle.Width, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
    谁你怎么说
      

  4.   

    myFont = new Font(family, 18, FontStyle.Bold);这样比较好 
      

  5.   

    绑定的数据集不能用cbZhuanYe.Items[e.Index].ToString(),要将该Item转成DataRowView类实例后进行取值绘制文本。