2009-11-24 4 views

Répondre

7

Vous pouvez le faire en réglant le DrawMode-OwnerDrawFixed qui vous permet de dessiner manuellement les éléments à l'aide de l'événement 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

Oui, mais avec la création de votre propre ComboBox avec dessin personnalisé See here on MSDN

0

Non, il n'y a pas de propriété intégrée pour le faire. Vous devrez construire votre propre contrôle et remplacer le rendu.

11

Aussi ancien que ce billet, je l'ai trouvé utile comme point de départ pour chercher mais a fini par avoir de meilleurs résultats en utilisant la méthode montrée here par @Paul.

Voici le code que j'ai utilisé pour faire apparaître de façon conditionnelle les éléments d'une liste déroulante en gras, je trouve que la réponse correcte pour cette question a un comportement étrange - lorsque vous survolez un élément devient plus audacieux et reste comme s'il est redessiné. Ce code entraîne dans un look plus naturel:

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

Juste pour ajouter à la réponse fournie par Dan, ne pas oublier que si vous avez lié la liste à une source de données, plutôt que d'avoir simplement un ComboBox avec des chaînes simples , vous ne serez pas en mesure de redessiner l'entrée en utilisant combo.Items[e.Index].ToString(). Si par exemple, vous avez lié la zone de liste déroulante à un DataTable, et essayez d'utiliser le code dans la réponse de Dan, vous allez vous retrouver avec une zone de liste déroulante contenant System.Data.DataRowView, car chaque élément de la liste n'est pas un chaîne, c'est une DataRowView.

Le code dans ce cas serait quelque chose comme ce qui suit:

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" est le nom du champ à afficher dans la liste (définie dans la propriété ComboBox1.DisplayMember).

Questions connexes