Aussi vieux que ce post est, je l'ai trouvé un point de départ utile pour la recherche, mais a fini par avoir de meilleurs résultats en utilisant la méthode ci ici par @Paul.
Voici le code que j'ai utilisé pour conditionnellement faire des articles dans une liste déroulante apparaît en gras, je trouve que la réponse correcte à cette question a un comportement étrange: lorsque vous survolez un élément est légèrement plus audacieux et le reste de cette façon que si elle est d'être redessiné. Ce code entraîne un look plus naturel:
privatevoidComboBox1_DrawItem(object sender,DrawItemEventArgs e){if(e.Index==-1)return;ComboBox combo =((ComboBox)sender);
using (SolidBrush brush =newSolidBrush(e.ForeColor)){Font font = e.Font;if(/*Condition Specifying That Text Must Be Bold*/)
font =newSystem.Drawing.Font(font,FontStyle.Bold);
e.DrawBackground();
e.Graphics.DrawString(combo.Items[e.Index].ToString(), font, brush, e.Bounds);
e.DrawFocusRectangle();}}
Juste pour ajouter à la réponse fournie par Dan, n'oubliez pas que si vous avez lié la liste à une source de données, plutôt que d'avoir une liste déroulante avec la plaine des chaînes, vous ne serez pas en mesure de redessiner l'entrée à l'aide de 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 de Dan réponse, tu risquerais de te retrouver avec une zone de liste déroulante contenant System.Data.DataRowView, comme chaque élément de la liste n'est pas une chaîne, c'est un DataRowView.
Le code dans ce cas serait quelque chose comme:
privatevoidComboBox1_DrawItem(object sender,DrawItemEventArgs e){if(e.Index==-1)return;ComboBox combo =((ComboBox)sender);
using (SolidBrush brush =newSolidBrush(e.ForeColor)){Font font = e.Font;DataRowView item =(DataRowView)combo.Items[e.Index];if(/*Condition Specifying That Text Must Be Bold*/){
font =newSystem.Drawing.Font(font,FontStyle.Bold);}else{
font =newSystem.Drawing.Font(font,FontStyle.Regular);}
e.DrawBackground();
e.Graphics.DrawString(item.Row.Field<String>("DisplayMember"), font, brush, e.Bounds);
e.DrawFocusRectangle();}}
Où "DisplayMember" est le nom du champ à afficher dans la liste (à régler dans les ComboBox1.DisplayMember propriété).
Vous pouvez le faire en mettant l' DrawMode à
OwnerDrawFixed
qui vous permet de tirer manuellement les éléments à l'aide de la DrawItem événement.OriginalL'auteur Bob
Aussi vieux que ce post est, je l'ai trouvé un point de départ utile pour la recherche, mais a fini par avoir de meilleurs résultats en utilisant la méthode ci ici par @Paul.
Voici le code que j'ai utilisé pour conditionnellement faire des articles dans une liste déroulante apparaît en gras, je trouve que la réponse correcte à cette question a un comportement étrange: lorsque vous survolez un élément est légèrement plus audacieux et le reste de cette façon que si elle est d'être redessiné. Ce code entraîne un look plus naturel:
OriginalL'auteur Dan
Juste pour ajouter à la réponse fournie par Dan, n'oubliez pas que si vous avez lié la liste à une source de données, plutôt que d'avoir une liste déroulante avec la plaine des chaînes, vous ne serez pas en mesure de redessiner l'entrée à l'aide de
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 de Dan réponse, tu risquerais de te retrouver avec une zone de liste déroulante contenant
System.Data.DataRowView
, comme chaque élément de la liste n'est pas une chaîne, c'est un DataRowView.Le code dans ce cas serait quelque chose comme:
Où
"DisplayMember"
est le nom du champ à afficher dans la liste (à régler dans lesComboBox1.DisplayMember
propriété).OriginalL'auteur Martin Davies
Oui, mais avec la création de votre propre zone de liste déroulante avec dessin personnalisé
Voir ici sur le site MSDN
OriginalL'auteur RvdK
Non, il n'y a pas de propriété de le faire. Vous aurez à construire votre propre contrôle et de remplacer le rendu.
OriginalL'auteur Fabian Vilers