miércoles, 12 de mayo de 2010

[WinForms] ComboBox Add ítems - SelectedValue

 

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]

11 comentarios:

  1. 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

    ResponderEliminar
  2. 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

    ResponderEliminar
  3. 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

    ResponderEliminar
  4. hola Miuler089

    si la ides es definir items fijos, podrias usar la coleccion Items

    imagen

    esto lo harias desde las propiedades del combo

    saludos

    ResponderEliminar
  5. 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.

    ResponderEliminar
  6. Hola leandro, sabes porque me pueda estar tomando en la propiedad SelectedValue de tipo object {ProyectoFichaPI.frmFicha.Item}

    Por esta razon tengo problemas para asignarle un valor al combobox :(

    Gracias Leandro!

    ResponderEliminar
  7. hola carlos_yy

    si 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

    ResponderEliminar
  8. Hola leandro, quisiera saber si aun tienes los sources de este ejemplo me ayudaría mucho gracias ya que soy nuevo en c#

    ResponderEliminar
  9. Estimado Leandro, puede ser que en Visual Studio 2015 Framework 4, no funcione la asignación de SelectedValue ?. ejemplo:
    Tengo 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

    ResponderEliminar
    Respuestas
    1. hola
      en 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

      Eliminar