none
Cargar datos desde sql a combobox RRS feed

  • Pregunta

  • Hola foro bueno una consulta, miren tengo dos combobox, del cual en el combobox1 traigo datos desde el sql y los llena en el combo, pero la gracia es esta ahor yo qiero que al seleccionar un item del combobox1, en el combobox2 se llene con datos de lo que le e seleccionado:   ejm: si en el combobox1 seleccione Peru quiero que el combobox2 se llene con sus departamentos(lima, arequipa, tacna), pero se llene con los datos que estan en la base de datos:

    les dejo el codigo del combobox1:

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
                Dim cmd As String = "SELECT DISTINCT pais FROM paises"
                Dim da As New SqlDataAdapter(cmd, cn)
                Dim dt As DataTable = New DataTable("paises")
                da.Fill(dt)
                With ComboBox1
                    .DataSource = dt
                    .DisplayMember = "pais"
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
    End Class  

    gracias de antemano...

    martes, 6 de septiembre de 2011 15:33

Respuestas

  • bueno gente, holas ya solucione ese detalle.. despues de leer y leer y entender como funciona el dataset...claro previamente mi datadapter y obvio que este tiene que tener almecenada mi  consulta que la llamo (cmd).

    aqui esta el codigo para posbles ayudas:

    Try
                Dim cmd As String = "select departamento from paises where pais= '" & Me.ComboBox1.Text & "'"
                Dim da As New SqlDataAdapter(cmd, cn)
                Dim ds As New DataSet
                da.Fill(ds)
                With Me.ComboBox2
                    Me.ComboBox2.DataSource = ds.Tables(0)
                    Me.ComboBox2.DisplayMember = "departamento"
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

    es sencillo en realidad si leen bastante y entienden cuando usar cada clase con sus respectivos metodos y funciones, pero en fin.

    xGs_Manco:   Siguiendo la misma estructura que usas (Que no es la mejor.).

    gracias por tu recomendacion, te comentare que estoy por el momento con esto, ya cuadno termine el aplicativo en si (1 mes kisa), lo pasare a capas ya que aun estoy por ver este tema o estudiar un cursito sobre ADO.. tengo entendido lo de las clases y llamr los objetos, para aligerara muchas cosas, pero aun quiero estar un poco mas diestro antes de adentrarme ahi, aqui en P.... la enseñanza no es muy buena.. solo depende del interes de cada uno  y bueno eso trato de hacer...

    grax .... Leandro   -  Enrique    x hacerme leer...

    • Marcado como respuesta jcuroca miércoles, 7 de septiembre de 2011 16:23
    miércoles, 7 de septiembre de 2011 16:22

Todas las respuestas

  • bien apuntas a combos relacionados

    [WinForms] ComboBox Anidados

    como veras usarias el evento SelectionChangeCommitted del combobox1 para en este evento tomar la seleccion y usarla como filtro de la query que carga el segundo combo

    analiza el articulo, seguro es de ayuda

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 6 de septiembre de 2011 15:40
  • ok etoy leyendo, pero esta en asp, bueno hay algo que no entiendo bien :

    esto a que hace referencia:

    private void cbArtist_SelectionChangeCommitted(object sender, EventArgs e)
    {
        int ArtistId = Convert.ToInt32(cbArtist.SelectedValue);

        LoadComboAlbum(ArtistId);
    }

    (cuando seleccione el evento hace que carge los comobs(loadcomboalbum(artistid)))

    y aca:

    rivate void LoadComboArtist()
    {
        cbArtist.DataSource = ChinookDAL.GellAllArtist();
        cbArtist.DisplayMember = "Name";
        cbArtist.ValueMember = "ArtistId";
    }

    (el chinookDAL---> esto a que hace referencia..) me podrias arientar ahi porfavor.

    y tambien hi esta por capas, yo hago consultas  desde el mismo form aun no implemento capas.

    gracias de  antemano..

    martes, 6 de septiembre de 2011 15:56
  • que cosa esta en asp, el ejemplo que proporcione en el link, o tu desarrollo ?

     

    esto a que hace referencia

    ese es el evento que mencionaba de combobox1 deberia tener en tu caso, para trabajar con el evento

    cuando seleccione el evento hace que carge los comobs(loadcomboalbum(artistid))

    claro para mantener prolijo el codigo se definen metodos que realicen la operacion pasandole la seleccion, en este caso del primer combo

    por eso el metodo LoadComboArtist()

    el chinookDAL---> esto a que hace referencia..) me podrias arientar ahi porfavor.

    la aplciacion trabja con una arquitectura de dos capas, la presentacion y los datos

    DAL seria el Data Access Layer, la capa de datos, que se encarga de recuperar la info de labase de datos y traerla a la presnetacion para cargarla en los controles

    es una buena forma de separar responsabilidades y mentener prolijo el codigo y ademas mantenible

    tambien hi esta por capas, yo hago consultas  desde el mismo form aun no implemento capas.

    la tecnica es la misma, en el ejemplo analzia la tecnica suada, no copies y peques el ejemplo, entienedelo y adaptalo a tu necesidad

    es logico que si no programas en capas el DAL no estara, pero si ves el codigo del DAL este solo ejecuta la query usando de filtro la seleccion del combo anterior

    eso es lo que debes replicar en tu caso

     

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 6 de septiembre de 2011 16:03
  • Hola:

    Si estás utilizando un objeto DataSet con objetos DataTable relacionados, lo mismo te resulta útil lo que explico en el siguiente artículo:

    Controles ComboBox relacionados

     

     


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    martes, 6 de septiembre de 2011 16:11
    Moderador
  • creo que deberias probar la misma conexion que hiciste en el formulario Form2_load que te carga los paises y al hacer un changed en el combo2 volves a hacer la misma conexion que haces para el Form2_Load pero con el query haciendo el inner join de paises con departamentos de las dos tablas. Asi deberia funcionar porque si te agrega en el primero el segundo es lo mismo pero con distinta query...... "No se si seria lo mas recomendable pero funciona porque ya lo he intentado varias veces y anduvo"

    Saludos

    Luis

    martes, 6 de septiembre de 2011 21:36
  • Siguiendo la misma estructura que usas (Que no es la mejor.). Lo que puedes hacer es:

    1. En el Load agregar bajo lo qee ya tienes esto:

    Try
                 Dim cmd As String = "SELECT DISTINCT pais, codigopais FROM paises"
                 Dim da As New SqlDataAdapter(cmd, cn)
                 Dim dt As DataTable = New DataTable("paises")
                 da.Fill(dt)
                 With ComboBox1
                     .DataSource = dt
                     .DisplayMember = "pais"<br/>
                    .ValueMember = "codigopais"<br/>              End With
             Catch ex As Exception
                 MessageBox.Show(ex.Message)
             End Try<br/><br/> Try<br/>             Dim cmd As String = "SELECT DISTINCT codigociudad, ciudad FROM ciudad WHERE pais='" & COMBOBOXPAISES.SELECTEDVALUE & "'"<br/>             Dim da As New SqlDataAdapter(cmd, cn)<br/>             Dim dt As DataTable = New DataTable("ciudades")<br/>             da.Fill(dt)<br/>             With ComboBox2<br/>                 .DataSource = dt<br/>                 .DisplayMember = "ciudad"<br/>                 .ValueMember = "codigociudad"<br/>             End With<br/>         Catch ex As Exception<br/>             MessageBox.Show(ex.Message)<br/>         End Try<br/>
    

    2. En el evento selecteditemchanged del combobox de los paises coloca esto:

    Try
                 Dim cmd As String = "SELECT DISTINCT ciudad FROM ciudad WHERE pais='" & COMBOBOXPAISES.SELECTEDVALUE & "'"
                 Dim da As New SqlDataAdapter(cmd, cn)
                 Dim dt As DataTable = New DataTable("ciudades")
                 da.Fill(dt)
                 With ComboBox2
                     .DataSource = dt
                     .DisplayMember = "ciudad"
                     .ValueMember = "codigociudad"
                 End With
             Catch ex As Exception
                 MessageBox.Show(ex.Message)
             End Try
    

    Una cosa si te digo, debes comenzar a utilizar Clases y Objetos en la manera como programas.


    La tecnologia te envuelve
    miércoles, 7 de septiembre de 2011 14:43
  • bueno gente, holas ya solucione ese detalle.. despues de leer y leer y entender como funciona el dataset...claro previamente mi datadapter y obvio que este tiene que tener almecenada mi  consulta que la llamo (cmd).

    aqui esta el codigo para posbles ayudas:

    Try
                Dim cmd As String = "select departamento from paises where pais= '" & Me.ComboBox1.Text & "'"
                Dim da As New SqlDataAdapter(cmd, cn)
                Dim ds As New DataSet
                da.Fill(ds)
                With Me.ComboBox2
                    Me.ComboBox2.DataSource = ds.Tables(0)
                    Me.ComboBox2.DisplayMember = "departamento"
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try

    es sencillo en realidad si leen bastante y entienden cuando usar cada clase con sus respectivos metodos y funciones, pero en fin.

    xGs_Manco:   Siguiendo la misma estructura que usas (Que no es la mejor.).

    gracias por tu recomendacion, te comentare que estoy por el momento con esto, ya cuadno termine el aplicativo en si (1 mes kisa), lo pasare a capas ya que aun estoy por ver este tema o estudiar un cursito sobre ADO.. tengo entendido lo de las clases y llamr los objetos, para aligerara muchas cosas, pero aun quiero estar un poco mas diestro antes de adentrarme ahi, aqui en P.... la enseñanza no es muy buena.. solo depende del interes de cada uno  y bueno eso trato de hacer...

    grax .... Leandro   -  Enrique    x hacerme leer...

    • Marcado como respuesta jcuroca miércoles, 7 de septiembre de 2011 16:23
    miércoles, 7 de septiembre de 2011 16:22
  • hola

    algo que cambiaria en el codigo que estas usando (y que veo no has sacado la diea del link que proporcione)

    es que uses parametros, es un tema muy importante aplicarlo y no concatenar el string para armar la query

     

     

    Try
    	Dim query As String = "select departamento from paises where pais= @pais"
    	Dim cmd As New SqlCommand(query, cn)
    	cmd.Parameters.AddWithValue("@pais", Me.ComboBox1.Text )
    	
    	Dim da As New SqlDataAdapter(cmd)
    	Dim ds As New DataSet
    	da.Fill(ds)
    	
    	With Me.ComboBox2
    		Me.ComboBox2.DataSource = ds.Tables(0)
    		Me.ComboBox2.DisplayMember = "departamento"
    	End With
    	
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try
    


     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 7 de septiembre de 2011 16:34
  • Hola bueno te comentare que si he pensado en cambiarlo a parametros  grax..

    sabes probe tu codigo y si corre pero da errores:

    Error 1 Array bounds cannot appear in type specifiers. 
    Error 2 'cmd' is not declared. It may be inaccessible due to its protection level.
    Error 3 'cmd' is not declared. It may be inaccessible due to its protection level.

    y bueno yo hice esto :
      Try
                Dim cmd As New SqlCommand
                cmd.CommandText = "select departamento from paises where pais=@pais"
                Dim da As New SqlDataAdapter(cmd, cn)
                Dim ds As New DataSet
                da.Fill(ds)
                cmd.Parameters.AddWithValue("@pais", ComboBox1.Text)
                With Me.ComboBox2
                    Me.ComboBox2.DataSource = ds.Tables(0)
                    Me.ComboBox2.DisplayMember = "departamento"
                End With
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
    pero em bota este error:
    Error 1 Overload resolution failed because no accessible 'New' can be called with these arguments:
        'Public Sub New(selectCommandText As String, selectConnection As System.Data.SqlClient.SqlConnection)': Value of type 'System.Data.SqlClient.SqlCommand' cannot be converted to 'String'.
        'Public Sub New(selectCommandText As String, selectConnection As System.Data.SqlClient.SqlConnection)': Value of type 'String' cannot be converted to 'System.Data.SqlClient.SqlConnection'.
        'Public Sub New(selectCommandText As String, selectConnectionString As String)': Value of type 'System.Data.SqlClient.SqlCommand' cannot be converted to 'String'. 
     por lo que entiendo es que mi sentencia debe ser string

    miércoles, 7 de septiembre de 2011 16:59
  • ups si olvide de definir el New en la declaracion del SqlCommand

    disculpa, ya edite el mensaje para que quede correcto

     

    igual algunas correcciones

    - cuando usas

    Dim cmd As New SqlCommand

    debes ponerle los parametros, con la query y la conexion, como mostre en el ejemplo

    sino vas a tener que pasar la conexion en la propiedad del cmd

     

    - segundo cuando haces

    Dim da As New SqlDataAdapter(cmd, cn)

    solo deberia ser

    Dim da As New SqlDataAdapter(cmd)

    porque la conexion se la asignas al sqlcommand

     

    - esta linea

    cmd.Parameters.AddWithValue("@pais", ComboBox1.Text)

    debe ir previa al Fill() ya que sino estas ejecutando la query sin pasrle el valor del parametro

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 7 de septiembre de 2011 17:04
  • ok modifique, pero ahora esta peor creo ... mira sale esto:

    fill:la propiedad selectCommand.Connection no se ha inicializado -->esto sale en n mensaje
    Error 1 Value of type 'String' cannot be converted to 'System.Data.SqlClient.SqlConnection'. 


    Ok hare las modificaciones que indicas...
    • Editado jcuroca miércoles, 7 de septiembre de 2011 17:22
    miércoles, 7 de septiembre de 2011 17:19
  • "jcuroca" escribió:

    > ya solucione ese detalle..
    > aqui esta el codigo para posbles ayudas:
    >
    > Dim ds As New DataSet
    > da.Fill(ds)
    >
    > Me.ComboBox2.DataSource = ds.Tables(0)

    Espero que tu aplicación no sea multiusuario, y que no tenga que acceder a un servidor remoto para consultar la tabla Paises. :-)

    Si estás trabajando con un objeto DataSet o DataTable, ¿qué sentido tiene estar dando "viajes de ida y vuelta a la base de datos", para rellenar el control ComboBox2 cada vez que se seleccione un elemento en el control ComboBox1?

    Si no estuvieran enlazados los controles ComboBox a objetos DataTable, podría tener sentido, pero como no es así, y ya que TIENES EN MEMORIA UN OBJETO DATASET, ¿qué más te da consultar el objeto DataTable en lugar de consultar la tabla de la base de datos física? La verdad es que no lo comprendo.

    Creo que las operaciones serían muchísimo más rápidas, y no se estaría malgastando ancho de banda efectuando consultas al servidor y devolviendo éste conjuntos de datos. Lo dicho, que espero que tu aplicación sea para pocos usuarios que trabajen en red.

    En el enlace que te indiqué, tienes la solución para no dar tantos "viajes de ida y vuelta" a la base de datos. :-)

     


    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    miércoles, 7 de septiembre de 2011 17:52
    Moderador
  • bueno en promedio es para unos 50 usuarios.. y tambien es mi primera ves programando algo para una empresa y son practicas ,  no me pagan  ..  :(  solo es experiencia.. y tambien ya me canse de hacer soporte xD!!... bueno bueno.. seguire estudiando... y  grax  ...    ;)

     

    Jair C.

    miércoles, 7 de septiembre de 2011 18:42