Se que la mayoría de vosotros llenáis un combobox con un datatable.docx

Embed Size (px)

Citation preview

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.SqlClientModule 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 SubEnd ModulePublic 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 SubEnd Public

si tu resultado lo cargas en un datatable, puedes asignar este directoa la propiedad DataSource del combo

- o sea ejecutar un stored procedure y cargar el resultado en undatatable, si sabes hacerlo ?

combobox1.DataSource = dtcombobox1.DisplayMember = "";combobox1.ValueMember = "";

el dt es el datatable que has cargado con los datos de le ejecuciondel procedure, podria ser algo como esto

Try

Using cnn As SqlConnection = New SqlConnection("connectionstring")

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 = dtcombobox1.DisplayMember = "DescProd"combobox1.ValueMember = "IdProd"

End Using

Catch ex As ExceptionMsgBox(ex.Message)End Try

este es solo un ejmeplo, GetProductos es el nombre del procedure, tudebes poner alli el que has creado y que usa a la funcioncon esta lineacmd.Parameters.AddWithValuele indicas el parametro al SP

y usando da.Fill(dt) usas el DataAdapter para cargar el datatable

saludos

1. Imports MySql.Data2. Imports MySql.Data.MySqlClient3. 4. Public Class Form15. 6. Private Sub ComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged7. '8. ' Crear la conexin a la base de datos9. Dim objConexion As MySqlConnection10. objConexion = New MySqlConnection11. objConexion.ConnectionString = "Server=localhost;Database=aduo_estetica;Uid=root;Pdw=*******;"12. ' 13. ' Crear adaptador14. Dim Da As New MySqlDataAdapter("SELECT * from prueba", objConexion)15. '16. ' Crear conjunto de datos17. Dim ds As New DataSet18. objConexion.Open()19. ' 20. ' utilizar el adaptador para llenar el dataset con una tabla21. Da.Fill(ds, "prueba")22. objConexion.Close()23. '24. ' una vez desconectado, recorrer la tabla del dataset25. Dim objTabla As DataTable26. objTabla = ds.Tables("prueba")27. '28. '29. Dim objFila As DataRow30. For Each objFila In objTabla.Rows31. '32. ' mostrar los datos mediante un objeto de fila33. ComboBox1.Items.Add(objFila.Item("prueba"))34. Next35. End Sub36. End Class