none
combobox depende de otro RRS feed

  • Pregunta

  • Hola,tengo un proyecto en el cual tengo 2 combobox uno de paises y otro de estados lo que quiero hacer es que cuando en el combo de paises eliga un pais en el combo de estados aparezcan solo los estados que tiene ese pais, los estoy sacando de una base de datos echas en oracle 

    el id del pais es una FK en la tabla de estados 

    Gracias

    jueves, 20 de octubre de 2016 13:52

Respuestas

  • Hola:

     Te dejo un ejemplo de lo que podrías hacer pare recuperar y mostrar la información que deseas:

    'Creamos una funcion que recupere la lista de Paises
    Public Function TraerPaises() As DataTable
    '
            'Encerramos la conexión en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
            'ademas de cerrar la conexión después de ejecutar la consulta
            '
            Using cnx As New OracleConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
                'Creamos una variable que contendra la consulta a ejecutar
                '
                Dim SqlAction As String = "SELECT * FROM Paises"
                '
                'Creamos un comando del tipo OracleCommand y le pasamos la variable que contiene
                'la consulta y la conexión
                '
                Using cmd As New OracleCommand(SqlAction, cnx)
                    '
                    'Creamos un objeto OracleDataAdapter, este objeto se encarga de abrir la conexión a la Bd
                    '
                    Dim da As New OracleDataAdapter(cmd)
                    '
                    'Creamos un objeto DataTable que contendrá los datos recuperados por el DataAdapter
                    '
                    Dim dt As New DataTable()
    
                    '
                    'Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
                    '
                    da.Fill(dt)
                    '
    				Return dt
    
                End Using
            End Using
    End Function
    
    'Usamos el evento Click de un botón para llamar a la función TraerPaises() y llenar el control ComboBox con los elementos recuperados
     Private Sub btnTraer_Click(sender As System.Object, e As System.EventArgs) Handles btnTraer.Click
    	 cmboxPaises.DataSource = TraerPaises()
    	 cmboxPaises.ValueMember = "PaisId"
    	 cmboxPaises.DisplayMember = "Nombre"
     End Sub
     
     'Creamos una función que recupere la lista de Estados filtrando por el código del país
    Public Function TraerEstados(ByVal paisId As Integer) As DataTable
    '
            'Encerramos la conexión en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
            'ademas de cerrar la conexión después de ejecutar la consulta
            '
            Using cnx As New OracleConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
                'Creamos una variable que contendrá la consulta a ejecutar
                '
                Dim SqlAction As String = "SELECT * FROM Estados WHERE PaisId = @paisId"
                '
                'Creamos un comando del tipo OracleCommand y le pasamos la variable que contiene
                'la consulta y la conexión
                '
                Using cmd As New OracleCommand(SqlAction, cnx)
                    '
                    'Creamos un objeto OracleDataAdapter, este objeto se encarga de abrir la conexión a la Bd
                    '
    				cmd.Parameters.AddWithValue("@paisId", paisId)
                    Dim da As New OracleDataAdapter(cmd)
                    '
                    'Creamos un objeto DataTable que contendrá los datos recuperados por el DataAdapter
                    '
                    Dim dt As New DataTable()
    
                    '
                    'Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
                    '
                    da.Fill(dt)
                    '
    				Return dt
    
                End Using
            End Using
    End Function
     
     
     'Usamos el evento SelectedChangueCommited del ComboBox Paises para mandar a llamar a la funcion TraerEstados y llenar el cmboxEstados
     Private Sub cmboxPaises_SelectionChangeCommitted(ByVal sender As Object, ByVal e As EventArgs) Handles cmboxPaises.SelectionChangeCommitted
    	 cmboxEstados.DataSource = TraerEstados(Convert.ToInt32(cmboxPaises.SelectedValue))
    	 cmboxEstados.ValueMember = "EstadoId"
    	 cmboxEstados.DisplayMember = "Nombre"
     End Sub

     El código esta echo en un NotePad por lo cual podría contener errores sintácticos, favor de analizarlo e implementarlo, no copies y pegues.

     Espero te sea de utilidad.


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

    jueves, 20 de octubre de 2016 14:52

Todas las respuestas

  • Hola:

     Pero no mencionas como es que estas trabajando, si usas DataTable o clases (yo sugeriría clases), tampoco mencionas las estructuras de tu tabla, pero te daré una sugerencia para el query que necesitas ejecutar:

    "SELECT EstadoId, Nombre FROM Estados WHERE PaisId = @paisId"

     De donde "@paisId" es el nombre del parámetro que deberás pasarle a la consulta para que haga el filtro correspondiente.

     Por favor si tienes código ya implementado proporcionalo para poder guiarte a partir de el.



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

    jueves, 20 de octubre de 2016 14:14
  • Aqui esta el codigo que uso para poblar el combo de estados solo que cuando uso el id_pais no me aparece ningun estado

     Public Sub poblarEstados()
            

            Try
                oracleDataAdapter = New OracleDataAdapter("SELECT id_estado,nombre FROM estados WHERE id_pais = '" & comPaises.Text & "' ", conexionOracle)

                tbl = New DataTable
                oracleDataAdapter.Fill(tbl)

                dr = tbl.NewRow
                dr("Nombre") = "Seleccione un estado"
                tbl.Rows.InsertAt(dr, 0)

                comEstados.DataSource = tbl
                comEstados.DisplayMember = "id_estado"
                comEstados.ValueMember = "id_estado"



                Combo_Estado.DataSource = tbl
                Combo_Estado.DisplayMember = "nombre"
                Combo_Estado.ValueMember = "nombre"

                Me.Refresh()
            Catch ex As Exception

            End Try
        End Sub


    jueves, 20 de octubre de 2016 14:20
  • Hola:

     Te dejo un ejemplo de lo que podrías hacer pare recuperar y mostrar la información que deseas:

    'Creamos una funcion que recupere la lista de Paises
    Public Function TraerPaises() As DataTable
    '
            'Encerramos la conexión en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
            'ademas de cerrar la conexión después de ejecutar la consulta
            '
            Using cnx As New OracleConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
                'Creamos una variable que contendra la consulta a ejecutar
                '
                Dim SqlAction As String = "SELECT * FROM Paises"
                '
                'Creamos un comando del tipo OracleCommand y le pasamos la variable que contiene
                'la consulta y la conexión
                '
                Using cmd As New OracleCommand(SqlAction, cnx)
                    '
                    'Creamos un objeto OracleDataAdapter, este objeto se encarga de abrir la conexión a la Bd
                    '
                    Dim da As New OracleDataAdapter(cmd)
                    '
                    'Creamos un objeto DataTable que contendrá los datos recuperados por el DataAdapter
                    '
                    Dim dt As New DataTable()
    
                    '
                    'Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
                    '
                    da.Fill(dt)
                    '
    				Return dt
    
                End Using
            End Using
    End Function
    
    'Usamos el evento Click de un botón para llamar a la función TraerPaises() y llenar el control ComboBox con los elementos recuperados
     Private Sub btnTraer_Click(sender As System.Object, e As System.EventArgs) Handles btnTraer.Click
    	 cmboxPaises.DataSource = TraerPaises()
    	 cmboxPaises.ValueMember = "PaisId"
    	 cmboxPaises.DisplayMember = "Nombre"
     End Sub
     
     'Creamos una función que recupere la lista de Estados filtrando por el código del país
    Public Function TraerEstados(ByVal paisId As Integer) As DataTable
    '
            'Encerramos la conexión en un Bloque using para asegurarse de destruir todos los objetos utilizados dentro
            'ademas de cerrar la conexión después de ejecutar la consulta
            '
            Using cnx As New OracleConnection(ConfigurationManager.ConnectionStrings("cnnString").ToString())
                'Creamos una variable que contendrá la consulta a ejecutar
                '
                Dim SqlAction As String = "SELECT * FROM Estados WHERE PaisId = @paisId"
                '
                'Creamos un comando del tipo OracleCommand y le pasamos la variable que contiene
                'la consulta y la conexión
                '
                Using cmd As New OracleCommand(SqlAction, cnx)
                    '
                    'Creamos un objeto OracleDataAdapter, este objeto se encarga de abrir la conexión a la Bd
                    '
    				cmd.Parameters.AddWithValue("@paisId", paisId)
                    Dim da As New OracleDataAdapter(cmd)
                    '
                    'Creamos un objeto DataTable que contendrá los datos recuperados por el DataAdapter
                    '
                    Dim dt As New DataTable()
    
                    '
                    'Llenamos el objeto DataTable con los datos recuperados por el DataAdapter
                    '
                    da.Fill(dt)
                    '
    				Return dt
    
                End Using
            End Using
    End Function
     
     
     'Usamos el evento SelectedChangueCommited del ComboBox Paises para mandar a llamar a la funcion TraerEstados y llenar el cmboxEstados
     Private Sub cmboxPaises_SelectionChangeCommitted(ByVal sender As Object, ByVal e As EventArgs) Handles cmboxPaises.SelectionChangeCommitted
    	 cmboxEstados.DataSource = TraerEstados(Convert.ToInt32(cmboxPaises.SelectedValue))
    	 cmboxEstados.ValueMember = "EstadoId"
    	 cmboxEstados.DisplayMember = "Nombre"
     End Sub

     El código esta echo en un NotePad por lo cual podría contener errores sintácticos, favor de analizarlo e implementarlo, no copies y pegues.

     Espero te sea de utilidad.


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

    jueves, 20 de octubre de 2016 14:52