none
relacionar 2 combobox con 2 tablas relacionadas en sql (Vb.net)

    Pregunta

  • Buenas tardes, aquí de nuevo, esta pregunta ya la avía formulado, pero no logre interpretar bien el código y sigo sin hacerlo funcionar.

    Mi método para llenar el combobox principal es mediante linq:

    (este código va en el load del formulario)

     ComboEstable.DropDownStyle = ComboBoxStyle.DropDownList
            Dim con2 = From p In db.Establecimientos Select p
            ComboEstable.DataSource = con2
            ComboEstable.DisplayMember = "Nomb_Estab"
            ComboEstable.ValueMember = "Id_Estab"

    dicho código me carga el el combobox los establecimientos de una empresa, ahora el 2do combobox llamado ComboArea, pretendo que me cargue las áreas correspondientes a cada establecimientos elegido en el combobox1, dicho código iría en el evento SelectionChangeCommitted

     Private Sub ComboEstable_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboEstable.SelectionChangeCommitted
            ComboEstable.ValueMember = "Id_Estab"
            ComboEstable.DisplayMember = "Nomb_Estab"
            ComboArea.DataSource = db.Areas.
            FirstOrDefault(Function(x) x.Id_Areas = Convert.ToInt32(ComboArea.SelectedValue))
        End Sub
    tengo este código que me facilitaron en este mismo foro, pero no logro hacerlo funcionar, 

    esta es la relación entre las tablas:

    y este es el formulario en donde cargo lo combobox:

    la idea de este formulario es poder identificar en que área pertenece cada departamento de la empresa y a la vez identificar a que establecimiento pertenece cada área...

    espero a verme dado a entender bien :)

    a ver si me pueden orientar un poco, agradezco su ayuda de ante mano :)

    jueves, 30 de marzo de 2017 21:27

Respuestas

  • Jefry Zelaya,

    Debes asegurarte de establecer el nombre correcto de las columnas en las propiedades ValueMember y DisplayMember según el nombre de las columnas en la tabla de base de datos:

    Private Sub ComboEstable_SelectionChangeCommitted(sender As Object...
    
    	Dim IdEstab = Convert.ToInt32(DirectCast(sender, ComboBox).SelectedValue)
    
    	ComboArea.ValueMember = "Id_Areas"
    	ComboArea.DisplayMember = "Descrip_Area"
    	ComboArea.DataSource = db.Areas.Where(Function(a) a.IDEstab = IdEstab).ToList()
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jefry Zelaya lunes, 3 de abril de 2017 14:14
    sábado, 1 de abril de 2017 16:59

Todas las respuestas

  • Jefry Zelaya,

    Recuerdo haber respondido esta pregunta en un post anterior (quizá es al que haces mención), sin embargo el código proporcionado no es el mismo que tú presentas y la diferencia radica en la expresión que utilizas para filtrar las áreas a razón de un establecimiento:

    ComboArea.ValueMember = "Id_Area"
    ComboArea.DisplayMember = "Descrip_Area"
    ComboArea.DataSource = db.Areas.
                FirstOrDefault(Function(x) x.IDEstab = Convert.ToInt32(ComboEstable.SelectedValue))

    Como vez, la selección se realiza a razón de la columna [IDEstab]


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    jueves, 30 de marzo de 2017 21:37
  • Jefry Zelaya,

    Recuerdo haber respondido esta pregunta en un post anterior (quizá es al que haces mención), sin embargo el código proporcionado no es el mismo que tú presentas y la diferencia radica en la expresión que utilizas para filtrar las áreas a razón de un establecimiento:

    ComboArea.ValueMember = "Id_Area"
    ComboArea.DisplayMember = "Descrip_Area"
    ComboArea.DataSource = db.Areas.
                FirstOrDefault(Function(x) x.IDEstab = Convert.ToInt32(ComboEstable.SelectedValue))

    Como vez, la selección se realiza a razón de la columna [IDEstab]


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Exactamente , tu me respondiste y a ese código hago mencion y si el codigo es algo diferente, en el anterior post lo plantie mal, este es el codigo que utilizo
    jueves, 30 de marzo de 2017 21:41
  • Escribe los cambios según te menciono en el presente post y coméntanos como te fue. Lo adjunto es el código que debe estar en el evento 'ComboEstable_SelectionChangeCommitted'.

    jueves, 30 de marzo de 2017 21:44
  • Escribe los cambios según te menciono en el presente post y coméntanos como te fue. Lo adjunto es el código que debe estar en el evento 'ComboEstable_SelectionChangeCommitted'.

    Los cambios son del post anterior a este antes tenia planteado, era que estaba relacionando las empresas a los establecimientos, cuando en realidad lo que pretendia o queria era relacionar los establecimientos a las areas, este era el codigo del post anterior: 

    Private Sub ComboDepto_SelectionChangeCommitted(sender As Object, ...
    
    	ComboEstable.ValueMember = "Id_Estab"
    	ComboEstable.DisplayMember = "Nomb_Estab"
    	ComboEstable.DataSource = db.Establecimientos.
    		FirstOrDefault(Function(x) x.Id_Empre = Convert.ToInt32(ComboDepto.SelectedValue))
    		
    End Sub
    la parte remarcada era la incorrecta, ahora bien pretendo cargar las areas de cada establecimiento, pero no me resulta, los carga en blanco (en la base de datos ya hay datos, así que esta descartada la opción de falta de datos)  a ver si me me ayudas con esa parte del codigo, no la logro interpretar bin y debido a eso no me carga lo que pretendo

    jueves, 30 de marzo de 2017 21:57
  • El codigo en el evento 'ComboEstable_SelectionChangeCommitted'. es una prueba que estaba haciendo, la cual no me resulto

    jueves, 30 de marzo de 2017 22:00
  • Williams, una pequeña consulta, no le faltaría agregar el combobox.DataBind() ? Saludos

    Si logré resolver tu consulta, no olvides votar como útil y/o marcar como respuesta.

    viernes, 31 de marzo de 2017 0:16
  • Williams, una pequeña consulta, no le faltaría agregar el combobox.DataBind() ? Saludos

    Si logré resolver tu consulta, no olvides votar como útil y/o marcar como respuesta.

    No, por el historial de las preguntas del OP y por la interface que muestra estoy casi seguro que se trata de un desarrollo Windows Form, y por lo que entiendo el método DataBind() aplica para WebControls (si no es así corrijanme porque yo no conozco de ASP .Net).


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 31 de marzo de 2017 0:28
  • Jefry Zelaya

    colocalo dentro de un try catch y muestranos el error, parece increíble pero a veces en winforms el try ayuda a que no genere ese tipo de eventos. Pruébalo!

    Saludos.


    Si logré resolver tu consulta, no olvides votar como útil y/o marcar como respuesta.

    viernes, 31 de marzo de 2017 0:40
  • Es cierto, había visto muy rápido el código y me confundí con asp.net, en winforms no se usa databind es correcto, las disuclpas del caso estimado.

    slds


    Si logré resolver tu consulta, no olvides votar como útil y/o marcar como respuesta.

    viernes, 31 de marzo de 2017 0:41
  • Jefry Zelaya,

    ¿Has intentado con el código adjunto (basado en las indicaciones del presente post)?, lo colocaré nuevamente:

    Private Sub ComboEstable_SelectionChangeCommitted(...
    
    	ComboArea.ValueMember = "Id_Area"
    	ComboArea.DisplayMember = "Descrip_Area"
    	ComboArea.DataSource = db.Areas.
    		FirstOrDefault(Function(x) x.IDEstab = Convert.ToInt32(ComboEstable.SelectedValue))
    
    End Sub

    Prueba, y coméntanos como te fue.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    Si, ya lo probé y sigue sin funcionar, no se me da bien olo de los combobos relacionados o anidados, en teoria deberia ser algo sencillo, pero para mi no lo es
    viernes, 31 de marzo de 2017 23:56
  • Jefry Zelaya,

    ¿Qué significa "sigue sin funcionar"? ¿obtienes alguna excepción? o ¿el objeto 'ComboArea' queda vacío?

    ¿Puedes colocar el código que tienes escrito de ambos desplegables?, en realidad es una operación muy sencilla, no deberías ocupar tanto tiempo en resolverla.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 1 de abril de 2017 0:17
  • Jefry Zelaya,

    ¿Qué significa "sigue sin funcionar"? ¿obtienes alguna excepción? o ¿el objeto 'ComboArea' queda vacío?

    ¿Puedes colocar el código que tienes escrito de ambos desplegables?, en realidad es una operación muy sencilla, no deberías ocupar tanto tiempo en resolverla.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    ok, , me explico mejor el combo queda vacio, no muestra ningun error en la compilacion, y si, yo se que es sencillo pero no lo logro hacer dar.

    este es el load del formulario:

    (utilizo el metodo linq para llenar el combobox)

      Private Sub FrmDeptos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
         
    
            ComboEstable.DropDownStyle = ComboBoxStyle.DropDownList
            Dim con2 = From p In db.Establecimientos Select p
            ComboEstable.DataSource = con2
            ComboEstable.DisplayMember = "Nomb_Estab"
            ComboEstable.ValueMember = "Id_Estab"
            ID = ComboEstable.SelectedValue
    
        End Sub

    ese funciona bien, ahora este el el codigo del combobox 2:

     
    Private Sub ComboEstable_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles ComboEstable.SelectionChangeCommitted
            ComboArea.ValueMember = "Id_Area"
            ComboArea.DisplayMember = "Descrip_Area"
            ComboArea.DataSource = db.Areas.
                FirstOrDefault(Function(x) x.IDEstab = Convert.ToInt32(ComboEstable.SelectedValue))
    
        End Sub

    Tengo el código de esa manera, pero no logro hacerlo funcionar, como te mencione el combobox2 me lo carga en blanco

    sábado, 1 de abril de 2017 14:24
  • Jefry Zelaya,

    Debes asegurarte de establecer el nombre correcto de las columnas en las propiedades ValueMember y DisplayMember según el nombre de las columnas en la tabla de base de datos:

    Private Sub ComboEstable_SelectionChangeCommitted(sender As Object...
    
    	Dim IdEstab = Convert.ToInt32(DirectCast(sender, ComboBox).SelectedValue)
    
    	ComboArea.ValueMember = "Id_Areas"
    	ComboArea.DisplayMember = "Descrip_Area"
    	ComboArea.DataSource = db.Areas.Where(Function(a) a.IDEstab = IdEstab).ToList()
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jefry Zelaya lunes, 3 de abril de 2017 14:14
    sábado, 1 de abril de 2017 16:59
  • Jefry Zelaya,

    Debes asegurarte de establecer el nombre correcto de las columnas en las propiedades ValueMember y DisplayMember según el nombre de las columnas en la tabla de base de datos:

    Private Sub ComboEstable_SelectionChangeCommitted(sender As Object...
    
    	Dim IdEstab = Convert.ToInt32(DirectCast(sender, ComboBox).SelectedValue)
    
    	ComboArea.ValueMember = "Id_Areas"
    	ComboArea.DisplayMember = "Descrip_Area"
    	ComboArea.DataSource = db.Areas.Where(Function(a) a.IDEstab = IdEstab).ToList()
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    Gracias por tu paciencia y por tus respuestas, ahora si me carga bien los combobox, gracias brother :)
    lunes, 3 de abril de 2017 14:14