2012-11-03 35 views
10

Próbuję obejść zmianę koloru podświetlania na liście rozwijanej ComboBox w aplikacji C# Windows Forms. Przeszukałem całą sieć w poszukiwaniu odpowiedzi, a najlepszą opcją, jaką znalazłem do tej pory, było narysowanie prostokąta żądanego koloru, gdy wybrany element jest rysowany.Zmiana koloru podświetlania ComboBox

Class Search 
{ 
    Public Search() 
    { 
    } 

    private void addFilter() 
    { 
     ComboBox field = new ComboBox(); 

     field.Items.AddRange(new string[] { "Item1", "item2" }); 
     field.Text = "Item1"; 
     field.DropDownStyle = ComboBoxStyle.DropDownList; 
     field.FlatStyle = FlatStyle.Flat; 
     field.BackColor = Color.FromArgb(235, 235, 235); 
     field.DrawMode = DrawMode.OwnerDrawFixed; 
     field.DrawItem += field_DrawItem; 
    } 

    private void field_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index >= 0) 
     { 
      ComboBox combo = sender as ComboBox; 

      if (e.Index == combo.SelectedIndex) 
       e.Graphics.FillRectangle(new SolidBrush(Color.Gray), 
             e.Bounds 
             ); 
      else 
       e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
             e.Bounds 
             ); 

      e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, 
            new SolidBrush(combo.ForeColor), 
            new Point(e.Bounds.X, e.Bounds.Y) 
           ); 
     } 
    } 
} 

Problem z tym kodem, jest to, że po wybraniu innego elementu na liście rozwijanej, a druga pozycja I narysuj prostokąt jest nadal z kolorem chcę podkreślić. Potem próbował uratować ostatniego elementu sporządzony i przerysować go:

Class Search 
{ 
    private DrawItemEventArgs lastDrawn; 

    Public Search() 
    { 
     lastDrawn = null; 
    } 

    private void addFilter() 
    { 
     ComboBox field = new ComboBox(); 

     field.Items.AddRange(new string[] { "Item1", "item2" }); 
     field.Text = "Item1"; 
     field.DropDownStyle = ComboBoxStyle.DropDownList; 
     field.FlatStyle = FlatStyle.Flat; 
     field.BackColor = Color.FromArgb(235, 235, 235); 
     field.DrawMode = DrawMode.OwnerDrawFixed; 
     field.DrawItem += field_DrawItem; 
    } 

    private void field_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index >= 0) 
     { 
      ComboBox combo = sender as ComboBox; 
      if (e.Index == combo.SelectedIndex) 
      { 
       e.Graphics.FillRectangle(new SolidBrush(Color.Gray), e.Bounds); 
       if(lastDrawn != null) 
        lastDrawn.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
               lastDrawn.Bounds 
               ); 
       lastDrawn = e; 
      } 
      else 
       e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
             e.Bounds 
             ); 

      e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, 
            new SolidBrush(combo.ForeColor), 
            new Point(e.Bounds.X, e.Bounds.Y) 
           ); 
     } 
    } 
} 

Linia ta zwraca błąd z powodu lastDrawn.Bounds (niezgodny typ)

lastDrawn.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
               lastDrawn.Bounds 
               ); 

czuję, że zmiana koloru podświetlenia listy rozwijanej jest niemożliwe. Z góry dziękuję!

Odpowiedz

20

Jeśli używasz ComboBox w więcej niż jednym miejscu w projekcie, nie ma sensu powtarzać tego samego kodu dla zdarzenia DrawItem w kółko. Po prostu dodaj tę klasę do swojego projektu, a otrzymasz nową kontrolkę ComboBox z właściwością HightlightColor, która ułatwi korzystanie z kontroli w całym projekcie:

class AdvancedComboBox : ComboBox 
{ 
    new public System.Windows.Forms.DrawMode DrawMode { get; set; } 
    public Color HighlightColor { get; set; } 

    public AdvancedComboBox() 
    { 
     base.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; 
     this.HighlightColor = Color.Gray; 
     this.DrawItem += new DrawItemEventHandler(AdvancedComboBox_DrawItem); 
    } 

    void AdvancedComboBox_DrawItem(object sender, DrawItemEventArgs e) 
    { 
     if (e.Index < 0) 
      return; 

     ComboBox combo = sender as ComboBox; 
     if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
      e.Graphics.FillRectangle(new SolidBrush(HighlightColor), 
            e.Bounds); 
     else 
      e.Graphics.FillRectangle(new SolidBrush(combo.BackColor), 
            e.Bounds); 

     e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, 
           new SolidBrush(combo.ForeColor), 
           new Point(e.Bounds.X, e.Bounds.Y)); 

     e.DrawFocusRectangle(); 
    } 
}