2009-11-24 16 views

Odpowiedz

7

Można to zrobić poprzez ustawienie DrawMode do OwnerDrawFixed który pozwala ręcznie rysować elementy używając zdarzenie 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

Nie, nie ma wbudowanej właściwości, aby to zrobić. Musisz zbudować własną kontrolę i nadpisać renderowanie.

11

Tak stary, jak ten post, uznałem go za użyteczny jako punkt wyjścia do wyszukiwania, ale zakończył się uzyskaniem lepszych wyników przy użyciu metody pokazanej jako here przez @Paul.

Oto kod, którego użyłem, aby warunkowo sprawić, że elementy w polu kombi wyglądają na pogrubione. Uważam, że odpowiedź oznaczona jako poprawna dla tego pytania ma dziwne zachowanie - po najechaniu kursorem element staje się nieco bardziej wyrazisty i pozostaje taki sam jeśli jest przerysowywany. Ten kod powoduje bardziej naturalny wygląd:

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

Wystarczy dodać do odpowiedzi dostarczonych przez Dan, nie zapomnij, że jeśli związany listę do DataSource, zamiast tylko o ComboBox z prostych ciągów , nie będzie można przerysować wpisu za pomocą combo.Items[e.Index].ToString().

Jeśli na przykład przywiązałeś ComboBox do DataTable i spróbujesz użyć kodu w odpowiedzi Dana, skończysz z ComboBox zawierającym System.Data.DataRowView, ponieważ każdy element na liście nie jest ciąg, to DataRowView.

Kod w tym przypadku byłoby coś jak poniżej:

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

      } 

Gdzie "DisplayMember" jest nazwa pola mają być wyświetlane na liście (ustawionej w nieruchomości ComboBox1.DisplayMember).

Powiązane problemy