none
Cargas multiples combobox con datatable RRS feed

Respuestas

  • Hola:

     Puedes crear diferentes funciones para cada ComboBox, cada función retornara un Datatable con la informaron pertinente a cada control, creando funciones individuales ordenas tu desarrollo y facilitas las futuras actualizaciones que pudiera sufrir la funcionalidad.

     En el evento Load, no lo recomendaría, ya que muchas veces la carga de datos en este evento genera un freeze de la ventana dando la impresión de que nada esta pasando y podría demorar "mucho" antes de que puedan verla cargada, sugeriría dos cosas:

     1. Utilizar un componente Timer para lanzar la carga 2 milisegudos después de haberse cargado el form, de esta forma el formulario se dibujara de forma casi instantánea y con el timer haces la llamada a las funciones, cargando cada control con sus respectivos datos.

    2. Dejar que el formulario cargue y utilizar otro evento, como el click de un botón para llamar a las funciones de carga.

     Ejemplo de código:

    Private Sub TraerInformacion1()
        '
        'Encerramos la conexion en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
        'ademas de cerrar la conexion despues de ejectuar la consulta
        'para mas informacion sobre el app.config: 
    	'http://joseluisgarciab.blogspot.mx/2013/10/app-config-cadenas-de-conexion.html
        Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
            'Creamos una variable que contendra la consulta a ejecutar
            '
            Dim SqlAction As String = "SELECT EstadoId, Nombre FROM Estados"
            '
            'Creamos un comeando del tipo SqlCommand y le pasamos la variable que contiene
            'la consulta y la conexion
            '
            Using cmd As New SqlCommand(SqlAction, cnx)
                '
                'Creamos un objeto DataAdapter este objeto se encarga de abrir la conexion a la Bd
                '
                Dim da As New SqlDataAdapter(cmd)
                '
                'Creamos un objeto DataTable que contendra los daos recuperados por el DataAdapter
                '
                Dim dt As New DataTable()
    
                '
                'Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
                '
                da.Fill(dt)
                '
                'Retornamos el DataTable con los datos cargados
                '
                Return dt
    
            End Using
        End Using
    End Sub
    
    
    'Usamos la funcion creada en el evento que desees:
    combobox.DataSource = TraerInformacion1()
    'Asignamos los campos corresondientes a las propiedades del control
    combobox.DisplayMember = "Nombre"
    combobox.ValueMember = "EstadoId"
    Prácticamente es repetir el código por cada control a llenar.

    Espero te sea de utilidad.

    ---------

    Aunque yo sugeriría que usaras Listas Genéricas, el DataTable se va quedando atrás:

    'Clase cliente
    Public Class Cliente
    	Public Property Codigo() As Integer
    	Public Property Nombre() As String
    End Class
    
    'Funcion para recuperar los cliente, esta funcion devolvera un objeto del tipo List(Of Cliente)
    Public Function Clientes() As List(Of Cliente)
    	'Declaramos una lista del objeto Cliente la cual será la encargada de
    	'regresar una colección de los elementos que se obtengan de la BD
    	'
    	Dim clientes As New List(Of Cliente)()
    	'Utilizas el archivo de configuraciones para llamar a la cadena de conecion
    	'mas información aquí: http://joseluisgarciab.blogspot.com/2013/10/app-config-cadenas-de-conexion.html
    	Using cnx As New SqlConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
    		'abres la conexión
    		cnx.Open()
    		'Declaramos la consulta SQL
    		Const  sqlQuery As String = "SELECT Codigo, (Codigo + ' ' + Nombre) AS 'CodigoNombre' FROM gen_entidad WHERE activo=1"
    		Using cmd As New SqlCommand(sqlQuery, cnx)
    			'Ejecutados el comando
    			Dim dataReader As SqlDataReader = cmd.ExecuteReader()
    			'
    			'Preguntamos si el DataReader fue devuelto con datos
    			While dataReader.Read()
    				'
    				'Instanciamos al objeto Inventario para llenar sus propiedades
    					'Otros campos
    				Dim cliente As New Cliente() With { _
    					Codigo = Convert.ToInt32(dataReader("codigo")), _
    					Cliente = Convert.ToString(dataReader("codigonombre"))
    				}
    				'
    				'Insertamos el objeto Producto dentro de la lista Productos
    				clientes.Add(cliente)
    			End While
    		End Using
    	End Using
    	Return clientes
    End Function
    
    Private Sub cmbClientes_Click(sender As Object, e As EventArgs) Handles cmbClientes.Click
    	'Llamamos a la funcion en cargada de recuperar los datos
    	cmbClientes.DataSource = Clientes()
    	cmbClientes.DisplayMember = "codigoNombre"
    	cmbClientes.ValueMember = "codigo"
    End Sub

    Sea cual sea la forma que elijas, tienes los ejemplos base.


    Saludos desde Monterrey, Nuevo León, México!!!



    sábado, 29 de julio de 2017 20:15