213 votes

ComboBox : Ajout de texte et de valeur à un élément (sans source de liaison)

En C# WinApp, comment puis-je ajouter à la fois le texte et la valeur aux éléments de ma ComboBox ? J'ai fait une recherche et généralement les réponses utilisent "Binding to a source"... mais dans mon cas, je n'ai pas de source de liaison prête dans mon programme... Comment puis-je faire quelque chose comme ceci :

combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"

389voto

Adam Markowitz Points 4358

Vous devez créer votre propre type de classe et remplacer la méthode ToString() pour renvoyer le texte que vous souhaitez. Voici un exemple simple de classe que vous pouvez utiliser :

public class ComboboxItem
{
    public string Text { get; set; }
    public object Value { get; set; }

    public override string ToString()
    {
        return Text;
    }
}

Voici un exemple simple de son utilisation :

private void Test()
{
    ComboboxItem item = new ComboboxItem();
    item.Text = "Item text1";
    item.Value = 12;

    comboBox1.Items.Add(item);

    comboBox1.SelectedIndex = 0;

    MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToString());
}

4 votes

Avons-nous vraiment besoin de cette nouvelle classe ComboboxItem ? je pense qu'il en existe déjà une appelée ListItem.

18 votes

Je crois que cela n'est disponible qu'en ASP.NET et non en WinForms.

0 votes

Oui :( malheureusement, il n'existe qu'en ASP.net ... alors que puis-je faire maintenant ?

199voto

fab Points 755
// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
        test.Add("1", "dfdfdf");
        test.Add("2", "dfdfdf");
        test.Add("3", "dfdfdf");
        comboBox1.DataSource = new BindingSource(test, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";

// Get combobox selection (in handler)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;

4 votes

Cela fonctionne parfaitement et cela devrait être la réponse sélectionnée. Mais ne pouvons-nous pas utiliser comboBox1.SelectedText au lieu du casting .SelectedItem et prendre .Value ?

0 votes

@fab comment trouver l'élément dans la combobox avec une certaine clé

0 votes

Est-il possible de sélectionner un élément dans la liste déroulante en fonction de la clé du dictionnaire ? Par exemple, si vous sélectionnez la clé 3, l'élément avec la clé 3 sera sélectionné.

128voto

buhtla Points 517

Vous pouvez utiliser une classe anonyme comme ceci :

this.ReportListComboBox.DisplayMember = "Text";
this.ReportListComboBox.ValueMember = "Value";

this.ReportListComboBox.Items.Add(new { Text = "report A", Value = "reportA" });
this.ReportListComboBox.Items.Add(new { Text = "report B", Value = "reportB" });
this.ReportListComboBox.Items.Add(new { Text = "report C", Value = "reportC" });
this.ReportListComboBox.Items.Add(new { Text = "report D", Value = "reportD" });
this.ReportListComboBox.Items.Add(new { Text = "report E", Value = "reportE" });

UPDATE : Bien que le code ci-dessus s'affiche correctement dans la boîte combo, vous ne serez pas en mesure d'utiliser SelectedValue ou SelectedText de la boîte combo. Pour pouvoir les utiliser, liez la boîte combo comme ci-dessous :

this.ReportListComboBox.DisplayMember = "Text";
this.ReportListComboBox.ValueMember = "Value";

var items = new[] { 
    new { Text = "report A", Value = "reportA" }, 
    new { Text = "report B", Value = "reportB" }, 
    new { Text = "report C", Value = "reportC" },
    new { Text = "report D", Value = "reportD" },
    new { Text = "report E", Value = "reportE" }
};

this.ReportListComboBox.DataSource = items;

14 votes

Je voudrais modifier légèrement cette méthode, car un programmeur aura probablement besoin d'une boucle for en même temps. Au lieu d'un tableau, j'ai utilisé une liste List<Object> items = new List<Object>(); Ensuite, j'ai pu utiliser la méthode items.Add( new { Text = "report A", Value = "reportA" } ); à l'intérieur de la boucle.

1 votes

Andrew, avez-vous réussi à faire fonctionner la List<Object> avec la propriété SelectedValue ?

0 votes

@Venkat, comboBox.SelectedItem.GetType().GetProperty("Value")‌​.GetValue(comboBox.S‌​electedItem, null)

15voto

Amr ElGarhy Points 12696

C'est l'un des moyens qui m'est venu à l'esprit :

combo1.Items.Add(new ListItem("Text", "Value"))

Et pour modifier le texte ou la valeur d'un élément, vous pouvez procéder comme suit :

combo1.Items[0].Text = 'new Text';

combo1.Items[0].Value = 'new Value';

Il n'y a pas de classe appelée ListItem dans Formulaires Windows . Il n'existe que dans ASP.NET Vous devrez donc écrire votre propre classe avant de l'utiliser, comme l'a fait @Adam Markowitz dans le document sa réponse .

Consultez également ces pages, elles peuvent vous aider :

3 votes

Sauf erreur de ma part, ListItem n'est disponible qu'en ASP.NET.

0 votes

Oui :( malheureusement, il n'existe qu'en ASP.net ... alors que puis-je faire maintenant ?

0 votes

Alors, quel est l'intérêt des propriétés SelectedValue ou SelectedText dans une combobox ?

11voto

Charles Glisan Points 61

Je ne sais pas si cela fonctionnera pour la situation décrite dans le message original (sans tenir compte du fait que nous sommes deux ans plus tard), mais cet exemple fonctionne pour moi :

Hashtable htImageTypes = new Hashtable();
htImageTypes.Add("JPEG", "*.jpg");
htImageTypes.Add("GIF", "*.gif");
htImageTypes.Add("BMP", "*.bmp");

foreach (DictionaryEntry ImageType in htImageTypes)
{
    cmbImageType.Items.Add(ImageType);
}
cmbImageType.DisplayMember = "key";
cmbImageType.ValueMember = "value";

Pour relire votre valeur, vous devrez convertir la propriété SelectedItem en un objet DictionaryEntry, et vous pourrez ensuite évaluer les propriétés Key et Value de cet objet. Par exemple :

DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X