Introducción
Suele suceder cuando se quiere representar información en ciertos controles como ser combos, o listas, que no se conozca cual es la mejor forma para trabajarlos obteniendo un acceso rápido a sus ítems.
Una claro caso es el uso de combo cuando se necesite agregar ítems de forma manual, y no se dispone de una lista u objetos de datos para bindearlo.
Como proceder en estos casos? bueno este articulo intentara mostrar como trabajar con este control, mostrando como bindearlo y como seleccionar un valor programáticamente.
Cargar ítems al ComboBox
El primer paso será la carga de los ítems al combo, en este caso serán valores manuales los que se dispones, estos no proceden de una consulta a una tabla, o de algún servicio para recuperarlos, sino que son ítems que uno quieres desplegar en el control.
La mejor forma para hacerlo es usando una clase, específicamente creada para este caso, podría ser algo como esto:
public class Item
{
public string Name {get; set;}
public int Value{get; set;}
public Item(string name, int value)
{
Name = name;
Value = value;
}
public override string ToString()
{
return Name;
}
}
Es una clase muy simple que solo tiene dos propiedades, las cuales recibirá en el constructor los valores que uno decida cuando cree cada instancia.
La carga de cada ítem será realizada en el Load del formulario:
private void Form1_Load(object sender, EventArgs e)
{
List<Item> lista = new List<Item>();
lista.Add(new Item("Blue", 1));
lista.Add(new Item("Red", 2));
lista.Add(new Item("Green", 10));
lista.Add(new Item("Yellow", 5));
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "Value";
comboBox1.DataSource=lista;
//
// Se asigna el evento para control el cambio de seleccion
//
comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);
}
Como se visualiza la carga no respeta un orden especifico, ni sus valores de clave están en orden, esto es porque uno decide como se crea cada valor.
Lo que si es importante es que cada ítem no se agrega directo en el ComboBox, sino que se añade a la lista genérica definida del tipo de la clase creada anteriormente.
Al final se procede a bindear la lista al combo y se define los nombres de las propiedades que representan la visualización y el valor.
Asignar la selección de un ítem especifico
Un punto interesante es que será posible asignar directamente un valor al combo de forma programática y este seleccionara el ítem en la lista si es que esta presente.
private void btnSeleccionarValor_Click(object sender, EventArgs e)
{
int valor = 0;
if (!int.TryParse(txtValor.Text, out valor))
return;
comboBox1.SelectedValue = valor;
}
private void btnSeleccionarTexto_Click(object sender, EventArgs e)
{
comboBox1.Text = txtTexto.Text;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
Item seleccion = comboBox1.SelectedItem as Item;
if (seleccion == null)
return;
MessageBox.Show(string.Format("Se ha seleccionado Color: {0} Valor: {1}",
seleccion.Name ,
seleccion.Value ));
}
En el código se aprecia dos métodos de selección, ya sea por valor o texto, pero ambos trabajan de forma distintas.
En la selección por valor, si es asignado número que no en encuentra en la lista, el combo pasara a tomar el el SelectedIndex = –1, o sea no tendrá ningún valor activo, el SelectedItem pasara a devolver un null.
En cambio en la por Texto, si el valor no se encuentra en la lista dejara el que esta, no cambiara la selección.
| [C#]
|
[VB.NET]
|

4 comentarios:
Saludos
Si quisieramos seleccionar mediante codigo un elemento en concreto, eso que solemos hacer con:
combo.selectedvalue = codigo
para que aparezca seleccionado
¿como se haria? (o se podria hacer)
Un saludo y muchas gracias por tan magnifico articulo
hola Enrique
Te has dado tu mismo la respuesta es justamente asignando el SelectedValue que logras esto
Solo que debes definir un ValueMember para que funcione.
saludos
Muy entendible el ejemplo amigo, pero una consulta estoy trabajando con C# y en un combobox como podría anexar elementos enlazados a datos con elementos de la lista declarados estáticamente. Así como en asp.net existe la propiedad appendDataBounsItems. Espero tu ayuda. saludoss
hola Miuler089
si la ides es definir items fijos, podrias usar la coleccion Items
imagen
esto lo harias desde las propiedades del combo
saludos
Publicar un comentario en la entrada