2013-07-30 39 views
1

我有下面的代碼的用戶控件:與顏色選擇器所有者繪製組合框

public partial class ColorComboBox : ComboBox 
{ 
    public ColorComboBox() 
    { 
     InitializeComponent(); 

     this.DropDownStyle = ComboBoxStyle.DropDownList; 
     this.DrawMode = DrawMode.OwnerDrawFixed; 

     string[] colorNames = System.Enum.GetNames(typeof(KnownColor)); 

     this.Items.AddRange(colorNames); 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     if (e.Index < 0) return; 

     this.SuspendLayout(); 

     string s = (string)this.Items[ e.Index ]; 

     using (Brush b = new SolidBrush(Color.FromName(s))) 
     { 
      e.Graphics.DrawRectangle(Pens.Black, 2, e.Bounds.Top + 1, 20, 11); 
      e.Graphics.FillRectangle(b, 3, e.Bounds.Top + 2, 19, 10); 

      e.Graphics.DrawString(s, this.Font, Brushes.Black, 25, e.Bounds.Top); 
     } 

     e.DrawFocusRectangle(); 

     this.ResumeLayout(); 

    } 

} 

增加ComboBox的實例的形式,我有一個奇怪的問題後,鼠標指針下的每個項目都將該項目更改爲粗體。

有沒有人知道爲什麼會發生這種情況?

謝謝。

+0

這些'SuspendLayout'和'ResumeLayout'調用sho沒有必要。 – LarsTech

+0

@LarsTech:你說得對,他們沒有必要,所以我刪除了這些陳述。該代碼現在可以在添加'e.DrawBackround()'後生效。 – Intrepid

回答

1

我已成功通過添加以下行來排序了這一點:

e.DrawBackground(); 
0

由於它的正常工作

要使用它:

label1.Text = colorComboBox1.SelectedItem.ToString(); 
    label1.BackColor = Color.FromName(colorComboBox1.SelectedItem.ToString()); 

string s = (string)colorComboBox1.Items[colorComboBox1.SelectedIndex]; 
    label1.Text = s; 
    label1.BackColor = Color.FromName(s);