5.5.07

El ComboBox de VB.NET

Conocido es, por aquellos que desarrollamos en VB6, y migramos a VB.NET que la clase ComboBox ha cambiado respecto de su antecesor. Una de las cosas que ha perdido es la propidad TAG que nos permitía almecenar datos adicionales a los mostrados al usuario.

Generalmente el ComboBox es llenado desde la lectura de una tabla de una base de datos, dese la cual mostrábamos la descripción al usuario y en la propiead TAG almacenabamos el código de esa descripción, que es lo que realmente le interesa a nuestro sistema y para nuestra base de datos relacional.

En VB.NET la clase ComboBox tiene una propiedad, DataSource, que nos permite llenar los items del objeto directamente con un objeto DataTable o DataSet, previamente llenado con la lectura a una base de datos. Adicionalmente debemos indicar, en la propiedad DisplayMember, que columna de la tabla será vista por el usuario y, de forma opcional, podemos indicar otra columna de la tabla en la propiedad ValueMember, a fin de obtener su valor, al seleccionarse una opción, en la propiedad SelectedValue.

Pero ¿qué hacemos si necesitamos rescatar más datos? Pues hay un truco poco conocido. Supongamos que nuestro objeto DataTable, con el que llenáramos el ComboBox tenía las siguientes columnas: ID, DESCRIPCION, COD_INTERNO (en ese orden). Cuando rescatamos la propiedad Items podemos utilizar subíndices que indiquen la posición de la columna cuyo valor queremos rescatar, teniendo en cuenta que el subíndice cero apunta a la primera columna, en nuestro ejemplo ID.

Acá les dejo una pequeña rutina que mustra como hacer esto:

'****************************************************************************
'* BUSCA UN ELEMENTO EN UN COMBO QUE FUE LLENADO CON UN DATASOURCE
'* Parámetros
'*    cmb         objeto combobox
'*    txtToFind   texto a encontrar
'*    colPos      posicion de la columa a comparar en el datasource
'****************************************************************************
Function SearchInComboBox(ByVal cmb As ComboBox, _
                          ByVal txtToFind As String, _
                          Optional ByVal colPos As Integer = 0) _
                          As Integer
   Dim I As Integer
   With cmb
      For I = 0 To .Items.Count - 1
         If .Items(I)(colPos).ToString() = txtToFind Then
            Return I
         End If
      Next I
   End With
   Return -1
End Function

Con esta rutina podemos ubicar un elemento en el ComboBox basándonos en cualquier columna del origen de dato que lo llenó. La rutina retorna el índice del elemento o menos uno si no lo encontrase.

¿Cómo se utiliza?

Me.myComboBox.SelectedIndex = SearchInComboBox(Me.myComboBox, "53", 0)

En este ejemplo pedimos que se seleccione el elemento cuyo ID es 53, el tercer parámetro podríamos obviarlo puesto que la columna que deseamos comparar ocupa la primera posición (índice 0).

En este enlace podrán encontrar un ejemplo de cómo llenar un combobox a partir de un objeto DataSet, sin tener que leer una tabla de una base de datos.

3 Comentarios:

Anónimo dice...

Hola..Julio González Seara
pues estoy muy principiente en esta herramienta.. mi pregunta es la siguiete.. yo lleno el combobox desde una base de datos y todo eso y cuando lo ejecuto me muestra los datos...pero lo que yo quiero es que cuando el usuario seleccione un de esos datos.. yo no capture el texto que muestra si no el id que corresponde a este que obviamente es el de la base de datos creo que me hice entender...me gustaria que me pudieras ayudar

julio dice...

Julio Velasquez dice:

me.combo.selectedvalue

esta propiedad te arroja el id del item seleccionado.

Espero te sirva

kevfer dice...

Amigo.., te felicito por el aporte realmete me fue de mucha utilidad esta super comprensible el manejo... gracias...