.net - seleccionado - obtener value combobox c#
¿Cómo crear un Combobox de Winforms con Label y Value? (6)
Hay una propiedad llamada DisplayMember
= nombre de la propiedad cuyo valor se usará para mostrar, y ValueMember
que es la propiedad del que se usará para el valor.
Principalmente soy un desarrollador ASP.NET pero estoy trabajando en una aplicación WinForms y noté una gran diferencia entre el cuadro combinado ASP.NET (selección html) y el de WinForms. Encontré (tal vez incorrectamente) que el cuadro combinado de WinForm solo tiene una "etiqueta", mientras que ASP.NET le permite especificar una "etiqueta" y un "valor".
Estoy buscando utilizar un cuadro combinado de WinForms (u otro control comparable) con una etiqueta y un valor (Foobar / 42329). es posible? Intenté buscar la respuesta pero no he encontrado mucho. Si no hay forma de lograrlo, ¿cómo se puede avanzar y diseñar un cuadro combinado de WinForm que represente Ciudades con su id de base de datos asociada?
- Toronto / 2324
- Montreal / 64547
- Vancouver / 1213
Podría intentar crear una clase pequeña llamada ComboBoxItem
, así:
public class ComboBoxItem<T>
{
public string Label { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Label ?? string.Empty;
}
}
Y luego, cuando necesite obtener un objeto, simplemente transfiéralo a un ComboBoxItem
.
Puedo pensar en algunas maneras:
- anular
ToString()
de una claseCity
parareturn Name + " / " + Id;
- ídem, pero con un
TypeConverter
- agregue una propiedad
DisplayText
que devuelva lo mismo y useDisplayMember
- construir una clase shim para los datos
Por el último:
var data = cities.Select(city => new {
Id = city.Id, Text = city.Name + " / " + city.Id }).ToList();
cbo.ValueMember = "Id";
cbo.DisplayMember = "Text";
cbo.DataSource = data;
Suponiendo que sus valores son únicos, primero puede poblar un diccionario y luego vincular el cuadro combinado al diccionario. Lamentablemente, la vinculación de datos requiere un IList o un IListSource, por lo que debe envolverlo en Binding Source. Encontré la solución here .
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";
}
Un ComboBox se puede vincular a una colección de objetos estableciendo su propiedad DataSource
.
De forma predeterminada, la propiedad SelectedValue dará el objeto que se seleccionó, y la lista llamará a ToString
en cada objeto y mostrará el resultado.
Sin embargo, si configura la propiedad DisplayMember de ComboBox, se mostrará el valor de la propiedad nombrada en DisplayMember en la lista. De forma similar, puede establecer la propiedad ValueMember de ComboBox y la propiedad SelectedValue devolverá el valor de la propiedad nombrada por ValueMember.
Por lo tanto, debe vincular el ComboBox a una lista de objetos que tienen propiedades de Name
y Value
.
A continuación, puede establecer la propiedad [ DisplayMember
ComboBox a Name
y ValueMember
en Value
.
EDITAR : También puede llamar al método Add
y darle un objeto en lugar de un enlace de datos. Alternativamente, podría vincularlo a una List<T>
o a una matriz.
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;