C#ComboBox项突出显示无法使用DrawItem

时间:2013-11-21 00:01:16

标签: c# .net winforms

使用this帖子中标记答案的示例,我想出了这个。

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    using (DBDataContext data = new DBDataContext())
    {
        var query = (from a in data.Programs
                     where a.IsCurrentApplication == 1
                     select a.Name).Distinct();
        e.DrawBackground();

        string text = ((ComboBox)sender).Items[e.Index].ToString();

        Brush brush;
        if (query.Contains(text))
        {
            brush = Brushes.Green;
        }
        else
        {
            brush = Brushes.Black;
        }

        e.Graphics.DrawString(text,
            ((Control)sender).Font,
            brush,
            e.Bounds.X, e.Bounds.Y);
    }            
}

我正在做的是查询带有标志的应用程序的数据库。如果该标志为真(1),则我将组合框项目的文本更改为绿色。我的问题是,一旦绘制完所有项目。当我将光标悬停在某个项目上时,它不会突出显示。然而,它确实稍微改变了文本的黑暗。有没有办法让突出显示起作用?

1 个答案:

答案 0 :(得分:1)

正如我在评论中所说,在绘图时我们应尽可能避免使用非绘图代码。在某些情况下,这样做会导致一些闪烁,在某些情况下,结果是不可预测的。所以我们应该总是将这样的代码放在绘图路线之外。代码中的query应放在DrawItem事件处理程序之外,如下所示:

public Form1(){
  InitializeComponent();
  using (DBDataContext data = new DBDataContext()) {
    query = (from a in data.Programs
             where a.IsCurrentApplication == 1
             select a.Name).Distinct().ToList();//execute the query right 
  }
}
IEnumerable<string> query;
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {
    var combo = sender as ComboBox;
    e.DrawBackground();
    string text = combo.Items[e.Index].ToString();
    Brush brush = query.Contains(text) ? Brushes.Green : Brushes.Black;
    e.Graphics.DrawString(text, e.Font, brush, e.Bounds);
}