Come creare un Combobox Winforms con etichetta e valore?

Sono principalmente uno sviluppatore ASP.NET ma sto lavorando su un’app WinForms e ho notato una grande differenza tra la combobox ASP.NET (html select) e quella di WinForms. Ho trovato (forse erroneamente così) che la casella combinata di WinForm ha solo un’etichetta mentre ASP.NET consente di specificare una “etichetta” e un “valore”.

Sto cercando di utilizzare una combobox WinForms (o un altro controllo simile) con un’etichetta e un valore (Foobar / 42329). È ansible? Ho cercato di cercare la risposta, ma non ho trovato molto. Se non c’è modo di farlo, come si procede e si progetta una casella combinata WinForm che rappresenterebbe le città con l’id del database associato?

  • Toronto / 2324
  • Montreal / 64547
  • Vancouver / 1213

Posso pensare ad alcuni modi:

  • sovrascrivere ToString() di una class City per return Name + " / " + Id;
  • idem, ma con un TypeConverter
  • aggiungi una proprietà DisplayText che restituisca lo stesso e utilizza DisplayMember
  • build una class shim per i dati

Per l’ultimo:

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

Supponendo che i tuoi valori siano unici, puoi prima compilare un dizionario e quindi associare la combobox al dizionario. Sfortunatamente il databinding richiede un IList o un IListSource, quindi devi avvolgerlo in Binding Source. Ho trovato la soluzione qui .

  private void PopulateComboBox() { var dict = new Dictionary(); dict.Add(2324, "Toronto"); dict.Add(64547, "Vancouver"); dict.Add(42329, "Foobar"); comboBox1.DataSource = new BindingSource(dict, null); comboBox1.DisplayMember = "Value"; comboBox1.ValueMember = "Key"; } 

Potresti provare a creare una piccola class chiamata ComboBoxItem , in questo modo:

 public class ComboBoxItem { public string Label { get; set; } public T Value { get; set; } public override string ToString() { return Label ?? string.Empty; } } 

E poi quando hai bisogno di ottenere un object, basta lanciarlo su un ComboBoxItem .

Un ComboBox può essere associato a una raccolta di oggetti impostando la relativa proprietà DataSource .

Per impostazione predefinita, la proprietà SelectedValue assegnerà l’object che è stato selezionato e l’elenco chiamerà ToString su ciascun object e visualizzerà il risultato.
Tuttavia, se si imposta la proprietà DisplayMember di ComboBox, verrà visualizzato il valore della proprietà denominata in DisplayMember nell’elenco. Allo stesso modo, è ansible impostare la proprietà ValueMember di ComboBox e la proprietà SelectedValue restituirà il valore della proprietà denominata da ValueMember.


Pertanto, è necessario associare il controllo ComboBox a un elenco di oggetti con proprietà Name e Value .
È quindi ansible impostare la proprietà [ DisplayMember su Name e Proprietà ValueMember su Value ComboBox.

EDIT : puoi anche chiamare il metodo Add e assegnargli un object simile al databinding. In alternativa, è ansible associarlo a un List o a un array.

Esiste una proprietà denominata DisplayMember = nome della proprietà il cui valore verrà utilizzato per la visualizzazione e ValueMember che è la proprietà del da utilizzare per il valore.

  anestezi.DisplayMember = "Text"; anestezi.ValueMember = "Value"; anestezi.DataSource = new[] { new { Text = "Genel", Value = "G" }, new { Text = "Lokal", Value = "L" }, new { Text = "Sedasyon", Value = "S" } }; anestezi.SelectedIndex = 0;