Vous êtes sur la page 1sur 4

Se que la mayora de vosotros llenis un combobox con un datatable.

Hoy vamos a ver como llenar un combobox con una clase, y un datareader. El objetivo es crear un mtodo 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 condicin es que la SQL solo tendr dos campos. El primero ser el cdigo, y el segundo la descripcin mostrada en la lista del combobox. En primer lugar declararemos una clase pblica con dos propiedades para almacenar el cdigo y la descripcin, obtenidos desde el datareader. Esta clase rellenar un arraylist que ms tarde se utilizar como origen de datos del combobox que queremos poblar. El segundo paso consistir en declarar el procedimiento pblico 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 cdigo y nombre de una tabla de clientes de SQL Server. Debajo os dejo el cdigo 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

si tu resultado lo cargas en un datatable, puedes asignar este directo a la propiedad DataSource del combo - o sea ejecutar un stored procedure y cargar el resultado en un datatable, si sabes hacerlo ? combobox1.DataSource = dt combobox1.DisplayMember = "<nombre columna a mostrar>"; combobox1.ValueMember = "<nombre columna como valor>"; el dt es el datatable que has cargado con los datos de le ejecucion del procedure, podria ser algo como esto Try

Using cnn As SqlConnection = New SqlConnection("connection string") Dim cmd As SqlCommand = New SqlCommand("GetProductos", cnn) cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.AddWithValue("Modulo", txtModulo.Text) Dim da As New SqlDataAdapter(cmd); Dim dt As New DataTable(); da.Fill(dt); combobox1.DataSource = dt combobox1.DisplayMember = "DescProd" combobox1.ValueMember = "IdProd" End Using Catch ex As Exception MsgBox(ex.Message) End Try este es solo un ejmeplo, GetProductos es el nombre del procedure, tu debes poner alli el que has creado y que usa a la funcion con esta linea cmd.Parameters.AddWithValue le indicas el parametro al SP y usando da.Fill(dt) usas el DataAdapter para cargar el datatable saludos

1. Imports MySql.Data 2. Imports MySql.Data.MySqlClient 3. 4. Public Class Form1 5. 6. Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged 7. ' 8. ' Crear la conexin a la base de datos 9. Dim objConexion As MySqlConnection 10. objConexion = New MySqlConnection 11. objConexion.ConnectionString = "Server=localhost;Database=aduo_estetica;Uid=root;Pdw=*******;" 12. ' 13. ' Crear adaptador 14. Dim Da As New MySqlDataAdapter("SELECT * from prueba", objConexion) 15. ' 16. ' Crear conjunto de datos 17. Dim ds As New DataSet 18. objConexion.Open() 19. ' 20. ' utilizar el adaptador para llenar el dataset con una tabla 21. Da.Fill(ds, "prueba") 22. objConexion.Close() 23. ' 24. ' una vez desconectado, recorrer la tabla del dataset 25. Dim objTabla As DataTable 26. objTabla = ds.Tables("prueba") 27. ' 28. ' 29. Dim objFila As DataRow 30. For Each objFila In objTabla.Rows 31. ' 32. ' mostrar los datos mediante un objeto de fila 33. ComboBox1.Items.Add(objFila.Item("prueba")) 34. Next 35. End Sub 36. End Class