2009-11-24 17 views

Antwort

7

Sie können dies tun, indem Sie die DrawMode-OwnerDrawFixed Einstellung, die Sie manuell ermöglicht, um die Elemente zu ziehen mit dem DrawItem Ereignisse.

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

Ja, aber mit Ihrem eigenen ComboBox mit benutzerdefinierter Zeichnungserstellung See here on MSDN

0

Nein, es gibt keine integrierte Eigenschaft, um es zu tun. Sie müssen Ihr eigenes Steuerelement erstellen und das Rendering überschreiben.

11

So alt wie dieser Beitrag ist, fand ich es als Ausgangspunkt für die Suche nützlich, aber endete mit besseren Ergebnissen mit der Methode here von @Paul gezeigt.

Hier ist der Code, den ich verwendet habe, um Elemente in einem Kombinationsfeld fett erscheinen zu lassen, finde ich, dass die für diese Frage markierte Antwort merkwürdiges Verhalten hat - wenn Sie den Mauszeiger über ein Element bewegen, wird es etwas mutiger und bleibt so wenn es neu gezeichnet wird. Dieser Code führt ein natürlicheres Aussehen:

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

einfach auf die Antwort von Dan geliefert hinzuzufügen, vergessen Sie nicht, dass, wenn Sie die Liste auf eine Datenquelle gebunden, anstatt nur eine ComboBox mit einfachen Saiten Sie können den Eintrag nicht neu zeichnen, indem Sie combo.Items[e.Index].ToString() verwenden.

Wenn Sie zum Beispiel die ComboBox an eine DataTable gebunden haben und versuchen, den Code in Dans Antwort zu verwenden, erhalten Sie am Ende eine ComboBox mit System.Data.DataRowView, da jedes Element in der Liste keine ist Zeichenfolge, es ist ein DataRowView.

Der Code in diesem Fall so etwas wie die folgenden sein würde:

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

      } 

Wo "DisplayMember" Namen des Feldes in der Liste angezeigt werden (festgelegt in der ComboBox1.DisplayMember Eigenschaft).

Verwandte Themen