2009-11-24 99 views

回答

7

您可以通過設置DrawModeOwnerDrawFixed它允許你手動繪製使用DrawItem事件的項目做到這一點。

comboBox1.DrawMode = DrawMode.OwnerDrawFixed; 
comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem); 

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e) {  
    Font font = comboBox1.Font; 
    Brush brush = Brushes.Black; 
    string text = comboBox1.Items[e.Index]; 

    if (you want bold) 
     font = new Font(font, FontStyle.Bold); 

    if (you want green) 
     brush = Brushes.Green; 

    e.Graphics.DrawString(text, font, brush, e.Bounds); 
} 
0

不,沒有內置的屬性來做到這一點。您必須構建自己的控件並覆蓋渲染。

11

就像這篇文章一樣,我發現它有用作爲搜索的起點,但使用@Paul顯示的方法here有更好的結果。

這裏是我用來有條件地使組合框中的項目顯示爲粗體的代碼,我發現對於此問題標記正確的答案具有奇怪的行爲 - 當您將鼠標懸停在項目上時會稍微大膽,如果它正在重繪。該代碼產生一個更自然的外觀:

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) 
     { 
      if (e.Index == -1) 
       return; 
      ComboBox combo = ((ComboBox)sender); 
      using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
      { 
       Font font = e.Font; 
       if (/*Condition Specifying That Text Must Be Bold*/) 
        font = new System.Drawing.Font(font, FontStyle.Bold); 
       e.DrawBackground(); 
       e.Graphics.DrawString(combo.Items[e.Index].ToString(), font, brush, e.Bounds); 
       e.DrawFocusRectangle(); 
      } 

     } 
2

只需添加到丹提供的答案,不要忘了,如果你已經綁定列表到數據源,而不是僅僅具有簡單的字符串組合框,您將無法使用combo.Items[e.Index].ToString()重新繪製條目。

例如,如果您已將ComboBox綁定到DataTable,並嘗試使用Dan的答案中的代碼,那麼您最終將得到一個包含System.Data.DataRowView的ComboBox,因爲列表中的每個項目都不是字符串,它是一個DataRowView。

在這種情況下,代碼將是類似以下內容:

private void ComboBox1_DrawItem(object sender, DrawItemEventArgs e) 
      { 
       if (e.Index == -1) 
        return; 
       ComboBox combo = ((ComboBox)sender); 

       using (SolidBrush brush = new SolidBrush(e.ForeColor)) 
       { 
        Font font = e.Font; 
        DataRowView item = (DataRowView)combo.Items[e.Index]; 

        if (/*Condition Specifying That Text Must Be Bold*/) { 
         font = new System.Drawing.Font(font, FontStyle.Bold); 
        } 
        else { 
         font = new System.Drawing.Font(font, FontStyle.Regular); 
        }      

        e.DrawBackground(); 
        e.Graphics.DrawString(item.Row.Field<String>("DisplayMember"), font, brush, e.Bounds); 
        e.DrawFocusRectangle(); 
       } 

      } 

哪裏"DisplayMember"是要顯示在列表中(在ComboBox1.DisplayMember屬性設置)的字段的名稱。