2012-11-03 41 views
10

C#Windows FormsアプリケーションのComboBoxドロップダウンリストでハイライトの色を変更することを回避しようとしています。 私はウェブ全体で答えを探しました。これまでに見つかった最良の選択肢は、選択した項目が描画されているときに、希望する色の矩形を描くことでした。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) 
           ); 
     } 
    } 
} 

このコードの問題は、ドロップダウン内の別の項目が選択されると、私は四角形を描画し、他の項目は、私が強調表示する色とまだあるということです。

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) 
           ); 
     } 
    } 
} 

は、この行が原因lastDrawn.Boundsの誤差(非互換タイプ)私はハイライトの色を変えることを感じて

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

を返します。 は、それから私は、描かれた最後の項目を保存し、それを再描画してみましたドロップダウンは不可能です。 ありがとうございます!

答えて

20

ComboBoxをプロジェクト内の複数の場所で使用している場合は、DrawItemイベントで繰り返し同じコードを繰り返しても意味がありません。プロジェクトにこのクラスを追加するだけで、プロジェクト全体にコントロールを簡単に使用できるように、HightlightColorプロパティを持つ新しいComboBoxコントロールが用意されます:

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(); 
    } 
} 
関連する問題