La désactivation de certains Éléments dans une liste déroulante

J'ai une Application WinForms et je me demandais si il y avait un moyen plus élégant de la désactivation de la zone de liste déroulante élément sans modifier la propriété SelectedIndex -1 pour tous les valeurs.

J'ai cherché sur google et beaucoup de ces solutions font appel à ASP.Net DropDownLists mais ce LIEN semble prometteur. Je pense que j'ai peut-être de construire mon propre contrôle zone de liste déroulante, mais avant que je re-inventer la roue, je me dis que je voudrais demander ici si c'était possible.

Mise à JOUR

Voici la solution finale, grâce à l'Arif Eqbal:

//Add a Combobox to a form and name it comboBox1
//
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
this.comboBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.comboBox1_DrawItem);
this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
}
private void Form1_Load(object sender, EventArgs e)
{
this.comboBox1.Items.Add("Test1");
this.comboBox1.Items.Add("Test2");
this.comboBox1.Items.Add("Test3");
this.comboBox1.Items.Add("Test4");
this.comboBox1.Items.Add("Test5");
this.comboBox1.Items.Add("Test6");
this.comboBox1.Items.Add("Test7");
}
Font myFont = new Font("Aerial", 10, FontStyle.Underline|FontStyle.Regular);
Font myFont2 = new Font("Aerial", 10, FontStyle.Italic|FontStyle.Strikeout);
private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
if (e.Index == 1 || e.Index == 4 || e.Index == 5)//We are disabling item based on Index, you can have your logic here
{
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), myFont2, Brushes.LightSlateGray, e.Bounds);
}
else
{
e.DrawBackground();
e.Graphics.DrawString(comboBox1.Items[e.Index].ToString(), myFont, Brushes.Black, e.Bounds);
e.DrawFocusRectangle();
}
}
void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex == 1 || comboBox1.SelectedIndex == 4 || comboBox1.SelectedIndex == 5)
comboBox1.SelectedIndex = -1;
}
}
}
ASP.NET != WinForms, ne regardez pas là. L'extension de la base ComboBox n'est pas très dur (habituellement fait pour ajouter des cases à cocher, des icônes ou autres joyeusetés), mais je ne pense pas qu'il y est une telle prise en charge standard.
Le lien que vous avez mentionné, c'est la voie à suivre si vous voulez vraiment donner aux utilisateurs une idée de l'élément est désactivé. Vous pouvez dessiner le texte en grisé, vous pourriez ne pas montrer une sélection backcolor et ainsi de suite et bien sûr, l'utilisateur peut toujours sélectionner l'élément de sorte que vous devrait, bien sûr, poignée selectedIndexChanged et définir la propriété selectedIndex à -1. Mais il sera visuellement plus suggestif à faire de l'exercice.

OriginalL'auteur Mark Kram | 2012-07-12