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]
|
Saludos
ResponderEliminarSi 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
ResponderEliminarTe 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
ResponderEliminarhola Miuler089
ResponderEliminarsi la ides es definir items fijos, podrias usar la coleccion Items
imagen
esto lo harias desde las propiedades del combo
saludos
El se refería a tener elementos estáticos por ejemplo un elemento que diga "todas" y agregarle el contenido de un dataset enlazado a base de datos. Tengo la misma duda que el.
ResponderEliminarhola genji
ResponderEliminaralgo como esto
ComboBox - DropDownList – Opción “Todos”
saludos
Hola leandro, sabes porque me pueda estar tomando en la propiedad SelectedValue de tipo object {ProyectoFichaPI.frmFicha.Item}
ResponderEliminarPor esta razon tengo problemas para asignarle un valor al combobox :(
Gracias Leandro!
hola carlos_yy
ResponderEliminarsi es una aplicacion winforms recuerda asignar la propiedad ValueMember y DisplayMemeber del control
asi tomara ese los datos de los campos que alli indiques
saludos
Hola leandro, quisiera saber si aun tienes los sources de este ejemplo me ayudaría mucho gracias ya que soy nuevo en c#
ResponderEliminarEstimado Leandro, puede ser que en Visual Studio 2015 Framework 4, no funcione la asignación de SelectedValue ?. ejemplo:
ResponderEliminarTengo cargado en un combo:
codPais
Descripción
Lleno todo el combo con los países y cuando quiero asignar a la propiedad SelectedValue pro ejemplo el país 8, para que me muestre la descripción no lo hace:
this.comboBoxCountry.SelectedValue = 8;
Desde ya muchas gracias
hola
Eliminaren que evento cargas los datos del combo? recuerda que si lo haces en el Page_Load debes ubicar ese codigo dentro del if(!IsPostBack) sino perderas la seleccion
saludos