使用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),则我将组合框项目的文本更改为绿色。我的问题是,一旦绘制完所有项目。当我将光标悬停在某个项目上时,它不会突出显示。然而,它确实稍微改变了文本的黑暗。有没有办法让突出显示起作用?
答案 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);
}