web-dev-qa-db-fra.com

Comment créer un menu déroulant dans WinForms et C #

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.

9
Jaylen

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.

16

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){}.

4

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;
4
CularBytes

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"));
0
idursun