Je commence à utiliser Visual Studio/WinForms/C #
J'essaie de créer un simple menu déroulant dans lequel chaque valeur peut avoir une valeur et une étiquette.
C'est ce que je ferais en HTML si je créais une application Web. Mais comment puis-je faire cela avec C # et WinForms?
<select>
<option value="0">Please select One</option>
<option value="1">The first Options</option>
<option value="2">The Second Options</option>
<option value="3">The Third Options</option>
</select>
J'ai essayé ComboBox mais il semble que je ne suis pas autorisé à ajouter une valeur et une étiquette et l'utilisateur peut toujours taper ce qu'il veut.
J'ai essayé un ListBox mais cela ne m'a pas permis d'utiliser aussi bien la valeur que l'étiquette.
Si vous voulez une valeur et une légende (label), créez une classe appropriée
class ComboItem
{
public int ID { get; set; }
public string Text { get; set; }
}
Dans la zone de liste déroulante, vous définissez ensuite la propriété DisplayMember
sur Text
et la propriété ValueMember
sur ID
.
La DropDownStyle
de la ComboBox détermine son comportement. DropDownStyle.DropDown
permet à l'utilisateur de saisir du texte. Avec DropDownStyle.DropDownList
, l'utilisateur ne peut sélectionner que des éléments de la liste.
Vous pouvez remplir la ComboBox
comme ceci:
myCombo.DataSource = new ComboItem[] {
new ComboItem{ ID = 1, Text = "One" },
new ComboItem{ ID = 2, Text = "Two" },
new ComboItem{ ID = 3, Text = "Three" }
};
La DataSource
peut être n’importe quel type d’énumérable.
Vous pouvez récupérer l'ID sélectionné comme ceci
int id = (int)myComboBox.SelectedValue;
Notez que vous pouvez ajouter n'importe quel type d'élément à la ComboBox. Si vous ne spécifiez pas les propriétés DisplayMember
et ValueMember
, la zone de liste déroulante utilise la méthode ToString
de l'objet pour déterminer le texte affiché et vous pouvez récupérer l'élément sélectionné (valeur non sélectionnée) via la propriété SelectedItem
.
Si vous ajoutez des objets de ce type ...
class Person
{
public int PersonID { get; set }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return FirstName + " " + LastName;
}
}
... dans la zone de liste déroulante, vous pouvez récupérer l'élément sélectionné comme ceci
Person selectedPerson = (Person)myComboBox.SelectedItem;
int personID = selectedPerson.PersonID;
La ComboBox affichera les noms et prénoms des personnes.
Vous devez définir une source de données pour votre Combobox. Il est préférable de créer une classe et de transmettre une liste d'objets, par exemple:
private void Init()
{
List<Item> items = new List<Item>();
items.Add(new Item() { Text = "displayText1", Value = "ValueText1" });
items.Add(new Item() { Text = "displayText2", Value = "ValueText2" });
items.Add(new Item() { Text = "displayText3", Value = "ValueText3" });
comboBox1.DataSource = items;
comboBox1.DisplayMember = "Text";
comboBox1.ValueMember = "Value";
}
public class Item
{
public Item() { }
public string Value { set; get; }
public string Text { set; get; }
}
Mettez la méthode Init()
dans votre FormName_Load(object sender, EventArgs e){}
.
Il semble que la valeur ne soit qu'une référence à l'élément sélectionné, n'est-ce pas? Ensuite, vous pouvez utiliser l'index de la liste déroulante, cela facilite beaucoup.
Vous ne savez pas si vos éléments sont connus avant la construction; dans l'affirmative, ajoutez-les simplement au concepteur, propriétés de la liste déroulante. Sinon, vous pouvez les ajouter de manière dynamique en effectuant simplement:
List<string> items = new List<string>() { "item1", "item2" };
comboBox1.DataSource = items;
Et pour savoir quel article est sélectionné:
int index = comboBox1.SelectedIndex;
ComboBox affiche les résultats renvoyés par l'appel ToString
afin que vous puissiez définir une classe Display qui englobe la valeur et le texte d'affichage et les ajoute à votre liste déroulante.
C'est:
public class ItemDisplay<TValue>
{
private readonly string m_displayText;
public ItemDisplay(TValue value, String displayText)
{
this.Value = value;
m_displayText = displayText;
}
public TValue Value { get; set; }
public override string ToString()
{
return m_displayText;
}
}
et ajoutez des éléments à votre liste déroulante comme suit:
comboBox1.Items.Add(new ItemDisplay<int>(1, "FirstValue"));
comboBox1.Items.Add(new ItemDisplay<int>(2, "Second"));
comboBox1.Items.Add(new ItemDisplay<int>(3, "Third"));