2013-11-21 81 views
1

使用this後標記的答案中的示例我想出了這個。C#組合框項目高亮不能使用DrawItem

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

爲什麼不突出控件中的文本是嗎?這會產生更深刻的視覺衝擊,並且更加引人注目。 – Brian

+0

我可以試試。我不熟悉這是如何完成的。你有什麼建議嗎?感謝您的快速回復@Brian – HiTech

+1

@HiTech不建議在'DrawItem'事件處理程序中查詢某些內容。查詢可能會延遲繪圖並導致意外的結果。 –

回答

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