none
Mostrar en un datagridview 2 datatable RRS feed

  • Pregunta

  • Buenas tengo una duda, se que se puede mostrar en un mismo datagridview 2 tablas, el problema es que no se la manera para mostrar las 2. de la siguiente manera.

    La primera tabla tiene las siguientes columnas, id_estudiante, nombre, especialidad, y nota, por cada estudiante son 3 registros, tengo la otra tabal que contiene id_estudiante, id_especialidad y orden, las consultas están ordenadas de la misma manera id_estudiante y especialidad, ocupo unir en un datagridview las 2 tablas, donde muestre el id_estudiante, nombre, especialidad, nota y orden, lo que no tengo idea es como poder unir las 2 tablas.

    Aca les muestro una parte de mi código

    Public Sub cargarGrid()
    
            Dim tablaResultadosEstudianteEspecialidad As DataTable
            Dim tablaOrdenEspecialidad As DataTable
    
            miEstudiante = New MantenimientoEstudiantesLG
    
            tablaResultadosEstudianteEspecialidad = miEstudiante.consultarResultadosEstudianteEspecialidad.Tables(0)
            tablaOrdenEspecialidad = miEstudiante.consultarOrdenEspecialidad.Tables(0)
    
            For Each row As DataRow In tablaResultadosEstudianteEspecialidad.Rows
    
                dgvOrdenEspecialidad.Rows.Add(CStr(row("NombreCampo")), CStr(row("NombreCampo")), CStr(row("NombreCampo")), CStr(row("NombreCampo")), CStr(row("NombreCampo")))
    
            Next
    
        End Sub
    De ante mano les agradezco.


    Puru vida se les agradece Saludos Luis Ángel

    martes, 6 de octubre de 2015 15:53

Respuestas

  • Pon los dos DataTables dentro de un DataSet, y añádele un DataRelation que defina las columnas que establecen la relación entre las dos tablas:

    https://msdn.microsoft.com/en-us/library/vstudio/ay82azad(v=vs.100).aspx

    Una vez que tengas el Dataset así configurado, haz el DataBinding del DataGridView contra el DataSet (en lugar de contra las tablas). De esa manera, el datagridview pondrá un "+" en cada registro y pinchando en él se puede navegar entre tablas.

    martes, 6 de octubre de 2015 16:01
  • [...] la llave es compuesta (id_estudiante y id_especialidad) y no he logrado unirlo


    No hay problema porque la llave sea compuesta, el DataRelation lo permite. Fíjate en que el constructor tiene dos sobrecargas: una de ellas realciona una columna de la primera tabla contra una columna de la segunda tabla, y esta efectivamente no te vale. Pero hay otra muy similar que relaciona un array de columnas de la primera tabla contra un array de columnas de la segunda, y aquí sí que le puedes poner la llave compuesta. Si no te funciona, ponnos aquí el código que has escrito y estudiaremos cuál puede ser el fallo.
    miércoles, 7 de octubre de 2015 5:54

Todas las respuestas

  • Pon los dos DataTables dentro de un DataSet, y añádele un DataRelation que defina las columnas que establecen la relación entre las dos tablas:

    https://msdn.microsoft.com/en-us/library/vstudio/ay82azad(v=vs.100).aspx

    Una vez que tengas el Dataset así configurado, haz el DataBinding del DataGridView contra el DataSet (en lugar de contra las tablas). De esa manera, el datagridview pondrá un "+" en cada registro y pinchando en él se puede navegar entre tablas.

    martes, 6 de octubre de 2015 16:01
  • Si logre entender bien tu pregunta, básicamente necesitas hacer un join entre tus dos tablas, pero ya te encuentras en presentación y es allí donde quieres unirlo, te adjunto un código que hace un join en presentación entre dos datatable y el resultado lo manda al grid:

    #region Join
                var resul = (from drDBI in tablaBDI.AsEnumerable()
                             join drCRM in tablaCRM.AsEnumerable()
                                 on drDBI.Field<int>("PosicionBDI") equals drCRM.Field<int>("posicionCRM")
                             select new
                             {
                                 NomColBDI = drDBI.Field<string>("NombreBDI"),
                                 NomColCRM = drCRM.Field<string>("NombreCRM"),
                                 PosicionBDI = drDBI.Field<int>("PosicionBDI"),
                                 PosicionCRM = drCRM.Field<int>("posicionCRM"),
                                 NullBDI = drDBI.Field<string>("NullBDI"),
                                 NullCRM = drCRM.Field<string>("NullCRM"),
                                 TipoBDI = drDBI.Field<string>("TipoBDI"),
                                 TipoCRM = drCRM.Field<string>("TipoCRM"),
                                 longitudBDI = drDBI.Field<int?>("longitudBDI"),
                                 longitudCRM = drCRM.Field<int?>("longitudCRM")
                             });
                #endregion
    
                gvComparaciones.DataSource = resul;
                gvComparaciones.DataBind();

    Donde tablaBDI y tablaCRM son mis datatable, espero que te sirva.


    Roy Sillerico

    martes, 6 de octubre de 2015 16:01
  • Esta opción me  parece interesante pero al tratar unir me va dar un erro ya que en las tablas la llave es compuesta (id_estudiante y id_especialidad) y no he logrado unirlo

    Saludos


    Puru vida se les agradece Saludos Luis Ángel

    martes, 6 de octubre de 2015 20:45
  • Mmmmmm si tienes razón, tal vez si podrías mostrar el diagrama relacional o algo para entender bien el contexto en el que estas trabajando, así podríamos ver como trabajarlo.

    Roy Sillerico

    martes, 6 de octubre de 2015 21:15
  • [...] la llave es compuesta (id_estudiante y id_especialidad) y no he logrado unirlo


    No hay problema porque la llave sea compuesta, el DataRelation lo permite. Fíjate en que el constructor tiene dos sobrecargas: una de ellas realciona una columna de la primera tabla contra una columna de la segunda tabla, y esta efectivamente no te vale. Pero hay otra muy similar que relaciona un array de columnas de la primera tabla contra un array de columnas de la segunda, y aquí sí que le puedes poner la llave compuesta. Si no te funciona, ponnos aquí el código que has escrito y estudiaremos cuál puede ser el fallo.
    miércoles, 7 de octubre de 2015 5:54