37 votes

Combobox C # Winforms avec étiquette et valeur

J'ai une question qui je suis choqué, je n'ai pas eu besoin de le demander avant. Je suis la plupart du temps un ASP.net développeur mais je suis en train de travailler sur une application WinForms et a remarqué une grande différence entre l'ASP.NET zone de liste déroulante (select html) et que des WinForms. J'ai trouvé (peut-être à tort) que WinForm la zone de liste déroulante ne dispose que d'un "label", alors que ASP.NET vous permet de spécifier un "label" et une "valeur".

Je cherche à utiliser un WinForms zone de liste déroulante (ou un autre comparable de contrôle) avec une étiquette et une valeur (Foobar / 42329). Est-ce possible? J'ai tenté de trouver la réponse mais je n'ai pas trouvé de beaucoup de. Si il n'y a aucun moyen de l'atteindre, comment aller de l'avant et concevoir un WinForm combobox qui représenterait à-dire les Villes avec leurs associés id de base de données?

  • Toronto / 2324
  • Montréal / 64547
  • Vancouver / 1213

50voto

Marc Gravell Points 482669

Je peux penser à plusieurs façons:

  • remplacer le ToString() de City classe return Name + " / " + Id;
  • idem, mais avec un TypeConverter
  • ajoutez une propriété DisplayText qui renvoie la même chose et utilisez DisplayMember
  • construire une classe shim pour les données

Pour le dernier:

 var data = cities.Select(city => new {
     Id = city.Id, Text = city.Name + " / " + city.Id }).ToList();
cbo.ValueMember = "Id";
cbo.DisplayMember = "Text";
cbo.DataSource = data;
 

38voto

Jamie Ide Points 28680

En supposant que vos valeurs sont uniques, vous pouvez d'abord remplir un dictionnaire puis lier la zone de liste déroulante au dictionnaire. Malheureusement, la liaison de données nécessite une IList ou une IListSource, vous devez donc l'encapsuler dans Binding Source. J'ai trouvé la solution ici .

     private void PopulateComboBox()
    {
        var dict = new Dictionary<int, string>();
        dict.Add(2324, "Toronto");
        dict.Add(64547, "Vancouver");
        dict.Add(42329, "Foobar");

        comboBox1.DataSource = new BindingSource(dict, null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";
    }
 

6voto

mgbowen Points 4952

Vous pouvez essayer de créer une petite classe appelée ComboBoxItem , comme ceci:

 public class ComboBoxItem<T>
{
    public string Label { get; set; }
    public T Value { get; set; }

    public override string ToString()
    {
        return Label ?? string.Empty;
    }
}
 

Et puis, lorsque vous avez besoin d'obtenir un objet, il vous suffit de le convertir en ComboBoxItem .

4voto

SLaks Points 391154

Une zone de liste déroulante peut être lié à une collection d'objets, d'en définir l' DataSource de la propriété.

Par défaut, la propriété SelectedValue sera donner à l'objet qui a été sélectionné, et la liste d'appels ToString sur chaque objet et afficher le résultat.
Toutefois, si vous définissez la DisplayMember propriété de la zone de liste déroulante, il va afficher la valeur de la propriété nommée dans DisplayMember dans la liste. De même, vous pouvez définir la ValueMember propriété de la zone de liste déroulante et le SelectedValue si elle sera de retour la valeur de la propriété nommée par ValueMember.


Par conséquent, vous avez besoin de lier la zone de liste déroulante à une liste d'objets qui ont Name et Value propriétés.
Vous pouvez ensuite définir la zone de liste déroulante de l' [DisplayMember de la propriété d' Name et ValueMember de la propriété d' Value.

EDIT: Vous pouvez aussi appeler l' Add méthode et de lui donner un tel objet à la place de la liaison de données. Sinon, vous pouvez le lier à un List<T> ou un tableau.

1voto

CSharpAtl Points 3867

Il existe une propriété appelée DisplayMember = nom de la propriété dont la valeur sera utilisée pour l'affichage, et ValueMember qui est la propriété du à utiliser pour la valeur.

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