none
Ordenar DataGridView por Código por dos columnas distintas RRS feed

  • Pregunta

  • Buen día.

    Trabajo con VB 2015 y lo que necesito hacer es que un DGV que toma datos de diferentes Labels, TextBoxs y Comboboxs que tengo en el Formulario, (Botón mediante) vaya ordenando los datos por las columnas 1 y 5 por ejemplo. La columna 1 es una Fecha y la 5 es un Nro. de documento. Ocurre que se pueden ir insertando nuevos registros y la idea es que automáticamente se vayan re ordenando por las columnas descritas. Adjunto Form de carga de datos. El botón "Siguiente", es el que pasa los datos al DGV. Estos datos pasaran a ser guardados en una tabla posteriormente. Desde ya, muchas gracias por la posible ayuda.

    jueves, 7 de marzo de 2019 15:58

Respuestas

  • Hola:
    En este ejemplo se añaden filas haciendo click al boton Añadir al DGV1 con los valores de los controles que estan mas abajo.
    Una vez cargado el DGV, si se hace click en el boton ordenar, se carga un datatable con los valores del DGV1, se ordena y se muestra en el DGV2
    En un Form como el de la imagen


    Copia y pega el siguiente código

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView2.AllowUserToAddRows = False
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            ' Añadimos los datos
            Me.DataGridView1.Rows.Add(Me.txtId.Text, Me.dtpFecha.Value, Me.txtNombre.Text)
            'Limpiar lo controles
            Me.txtId.Text = ""
            Me.txtNombre.Text = ""
            Me.dtpFecha.Value = Date.Today
            Me.txtId.Focus()
        End Sub

        Private Sub btnOrdenar_Click(sender As Object, e As EventArgs) Handles btnOrdenar.Click
            Dim ldtDataTable As New DataTable
            'Añadimos las columnas.
            ldtDataTable.Columns.Add(New DataColumn("Id", Type.GetType("System.Int16")))
            ldtDataTable.Columns.Add(New DataColumn("Fecha", Type.GetType("System.DateTime")))
            ldtDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            Dim lRow As DataRow
            For Each loFila As DataGridViewRow In Me.DataGridView1.Rows
                lRow = ldtDataTable.NewRow
                lRow.Item("Id") = loFila.Cells("id").Value
                lRow.Item("Fecha") = loFila.Cells("Fecha").Value
                lRow.Item("Nombre") = loFila.Cells("Nombre").Value
                ldtDataTable.Rows.Add(lRow)
            Next
            '
            Dim view As DataView = New DataView(ldtDataTable)
            view.Sort = "Id, Nombre"
            DataGridView2.DataSource = view
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta CEB_ROJO viernes, 8 de marzo de 2019 16:39
    viernes, 8 de marzo de 2019 8:00

Todas las respuestas

  • Hola:
    Mira el siguiente enlace
    https://social.msdn.microsoft.com/Forums/es-ES/62891039-d5ba-4e9d-85fe-b62cef3d81b8/ordenar-datagridview-por-dos-columnas?forum=vbes

    Un saludo desde Bilbo
    Carlos

    jueves, 7 de marzo de 2019 20:45
  • Hola:
    Mira el siguiente enlace
    https://social.msdn.microsoft.com/Forums/es-ES/62891039-d5ba-4e9d-85fe-b62cef3d81b8/ordenar-datagridview-por-dos-columnas?forum=vbes

    Un saludo desde Bilbo
    Carlos

    Buenas noches.

    Ante que nada, gracias por responder.

    Pero si, este enlace ya lo hube visitado  anteriormente. Ocurre que aparece ésta linea : 

    dtView = New DataView(objeto_DataTable) donde refiere a Objeto DataTable.

    ¿Cual seria el Obj. DataTable en la forma que yo ingreso los datos al DGV?

    Disculpe mi desconocimiento, pero logro interpretar esa linea.

    saludos.

    Claudio E. Barral.

    jueves, 7 de marzo de 2019 23:39
  • Hola:
    En este ejemplo se añaden filas haciendo click al boton Añadir al DGV1 con los valores de los controles que estan mas abajo.
    Una vez cargado el DGV, si se hace click en el boton ordenar, se carga un datatable con los valores del DGV1, se ordena y se muestra en el DGV2
    En un Form como el de la imagen


    Copia y pega el siguiente código

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView2.AllowUserToAddRows = False
        End Sub
        Private Sub btnAñadir_Click(sender As Object, e As EventArgs) Handles btnAñadir.Click
            ' Añadimos los datos
            Me.DataGridView1.Rows.Add(Me.txtId.Text, Me.dtpFecha.Value, Me.txtNombre.Text)
            'Limpiar lo controles
            Me.txtId.Text = ""
            Me.txtNombre.Text = ""
            Me.dtpFecha.Value = Date.Today
            Me.txtId.Focus()
        End Sub

        Private Sub btnOrdenar_Click(sender As Object, e As EventArgs) Handles btnOrdenar.Click
            Dim ldtDataTable As New DataTable
            'Añadimos las columnas.
            ldtDataTable.Columns.Add(New DataColumn("Id", Type.GetType("System.Int16")))
            ldtDataTable.Columns.Add(New DataColumn("Fecha", Type.GetType("System.DateTime")))
            ldtDataTable.Columns.Add(New DataColumn("Nombre", Type.GetType("System.String")))
            Dim lRow As DataRow
            For Each loFila As DataGridViewRow In Me.DataGridView1.Rows
                lRow = ldtDataTable.NewRow
                lRow.Item("Id") = loFila.Cells("id").Value
                lRow.Item("Fecha") = loFila.Cells("Fecha").Value
                lRow.Item("Nombre") = loFila.Cells("Nombre").Value
                ldtDataTable.Rows.Add(lRow)
            Next
            '
            Dim view As DataView = New DataView(ldtDataTable)
            view.Sort = "Id, Nombre"
            DataGridView2.DataSource = view
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos

    • Marcado como respuesta CEB_ROJO viernes, 8 de marzo de 2019 16:39
    viernes, 8 de marzo de 2019 8:00
  • Muchas gracias por responder y sobre todo tan pronto.

    Estoy adaptando el código  y aparentemente funciona bien.

    Ocurre que la idea es de tener un solo DGV y a medida que se vayan ingresando registros, en ese mismo DGV se fueran ordenando automáticamente Por fecha primero y por Nro. después.

    Entiendo que en esta condición, tendré que hacer invisible el DGV1 y que solo sea visible el DGV2, porque en realidad no me interesa que se vean ambos DGV.

    Ahora veré que pasa si decido eliminar un registro o editarlo para modificar. Cosa que puede suceder en caso que el usuario equivoque algún dato o entrada.

    De todos modos insisto, muy agradecido por tu disposición y colaboración. 

    Saludos.

    Claudio

    viernes, 8 de marzo de 2019 16:39
  • Hola:
    NO has puesto como llenas el DGV.
    Te recomiendo que llenes un DataTable y que este sea el DataSource del DGV, te ahorrara mucho trabajo y "dolor de cabeza" porque se maneja "mejor" el DataTable que el DGV
    En tu caso el DataTable (no es visible) es el que contiene los datos y el DataView es el que se muestra

    Un saludo desde Bilbo
    Carlos

    viernes, 8 de marzo de 2019 20:27
  • Hola Carlos.

    Si, te puse como cargaba el DGV. Aclare que Botón mediante, pasaba los datos de distintos Labels, TextBoxs y Comboboxs. Lo que si no puse fue el código. Que en realidad es armar con un pequeño Sub, la estructura del DGV y luego de la misma forma que vos planteaste, trasladaba los datos al DGV. o sea con algo así:

    Me.DataGridView1.Rows.Add(Me.txtId.Text, Me.dtpFecha.Value, Me.txtNombre.Text)

    Cuando decía de invisibilizar, era con respecto a unode los DGV que vos planteas en tu ejemplo.

    Pero si, es mejor lo que propones crear un DataTable y usarlo de DataSource del DGV.

    Nuevamente muchas gracias por tu recomendación.

    Saludos.

    Claudio.

    domingo, 10 de marzo de 2019 1:28