Se que la mayoría de vosotros llenáis un combobox con un datatable. Hoy vamos a ver como llenar un combobox con una clase y un datareader. El objetivo es crear un método publico que rellene cualquier combobox de un formulario, enviandole una SQL que recuperará los datos deseados, y la referencia del combobox que queremos llenar. La única condición es que la SQL solo tendrá dos campos. El primero será el código, y el segundo la descripción mostrada en la lista del combobox.
En primer lugar declararemos una clase pública con dos propiedades para almacenar el código y la descripción, obtenidos desde el datareader. Esta clase rellenará un arraylist que más tarde se utilizará como origen de datos del combobox que queremos poblar.
El segundo paso consistirá en declarar el procedimiento público que será capaz de rellenar cualquier combobox. Cuando invoquemos a este procedimiento, enviaremos la referencia del combo a rellenar, y la SQL que obtendrá los datos que deseamos.
Para no extenderme demasiado, supongamos que tenemos un combobox llamado ComboClientes que queremos rellenar con el código y nombre de una tabla de clientes de SQL Server. Debajo os dejo el código necesario para utilizar este sistema con Visual Basic .Net.
Imports System.Data.SqlClient Module ProcedimientosPublicos Public Class ElementoCombo Private CodigoElemento As String Private TextoElemento As String Public Sub New(ByVal NuevoCodigo As String, ByVal NuevoTexto As String) CodigoElemento = NuevoCodigo TextoElemento = NuevoTexto End Sub Public ReadOnly Property Codigo() As String Get Return CodigoElemento End Get End Property Public ReadOnly Property Texto() As String Get Return TextoElemento End Get End Property End Class Public Sub CargarComboDesdeSql(ByRef ElComboBox As Windows.Forms.ComboBox, ByVal LaSQL As String) Dim Lista As New ArrayList Dim Conexion as SqlConnection Dim Comando As SqlCommand Dim Reader As SqlDataReader Conexion = New SqlConnection("server=localhost;uid=usuario;pwd=clave;database=agenda") Try Conexion.Open() Comando = New SqlCommand(LaSQL, Conexion) Reader = Comando.ExecuteReader() While Reader.Read Lista.Add(New ElementoCombo(Reader.GetValue(0).ToString, Reader.GetValue(1).ToString)) End While Reader.Close() Catch ex As Exception MessageBox.Show(ex.Message, "Metodo CargarComboDesdeSql", MessageBoxButtons.OK) Finally Conexion.Close() End Try With ElComboBox .DropDownStyle = ComboBoxStyle.DropDown .AutoCompleteMode = AutoCompleteMode.Suggest .AutoCompleteSource = AutoCompleteSource.ListItems .DataSource = Lista .ValueMember = "Codigo" .DisplayMember = "Texto" End With End Sub End Module Public Class FormularioDeEjemplo Private Sub FormularioDeEjemplo_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Dim SQL as String SQL = "SELECT ClienteId, ClienteNombre FROM Clientes " & _ "WHERE ClientePaisId = '034' " & _ "ORDER BY ClienteNombre" CargarComboDesdeSql(ComboClientes, SQL) End Sub End Public