none
Problema con ordenación DatagridView

    Pregunta

  • como puedo hacerle para que la columna ordene los datos correctamente

    aun que los datos los traigo de una base de datos, el datagridview no esta enlazado a la base de datos, solo quiero que al hacer click en el titulo de la columna se ordenen correctamente.

     
    martes, 28 de febrero de 2017 19:33

Respuestas

  • alguna idea¿?

    Por teoría, un algoritmo de ordenamiento permuta los valores por comparación (basado en una relación de orden) y la relación de orden es distinta entre un valor numérico y un valor alfanumérico. En un valor alfanumérico (o una cadena que contiene una representación numérica) los valores se comparan carácter por carácter y de izquierda a derecha, por tanto, es correcto esperar una secuencia ordenada bajo la forma: 1040, 1041, 1045, 959, 999.

    Tras lo dicho, si deseas ordenar valores con representación numérica como si se tratasen de valores numéricos entonces debes personalizar el proceso de ordenamiento, para ello puedes escribir en el evento 'SortCompare'  que se produce precisamente cuando se comparan dos valores de celda para producir una ordenación. Mencionas además que los valores de celda podrían contener valores alfanuméricos, hubiese sido conveniente nos adjuntes un ejemplo de valor alfanumérico para resolver el ordenamiento según el patrón, por ejemplo:

    Private Sub dgvFacturas_SortCompare(sender As Object, ...
    
    	If e.Column.Name = "NroFactura" Then 'Escribir el nombre de columna correcto
    
    		Dim Valor1 As Integer = 0
    		Dim Valor2 As Integer = 0
    
    		If Not Int32.TryParse(e.CellValue1, Valor1) Then '¿No contiene un valor numérico?
    			Valor1 = CInt(Regex.Match(e.CellValue1, "\d+").Value) 'Recuperar números
    		End If
    
    		If Not Int32.TryParse(e.CellValue2, Valor2) Then '¿No contiene un valor numérico?
    			Valor2 = CInt(Regex.Match(e.CellValue2, "\d+").Value) 'Recuperar números
    		End If
    
    		e.SortResult = Valor1.CompareTo(Valor2) 'Comparar valores para determinar el orden
    
    		e.Handled = True
    	End If
    
    End Sub

    En el ejemplo se desprecia la parte alfabética que para el ejemplo -convenientemente- es la constante F/., sin embargo debes adecuar el código según el valor alfanumérico que contengan las celdas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 3 de marzo de 2017 16:33

Todas las respuestas

  • Hola RHCRD,

    Ya que mencionas que tu DGV no está enlazado a datos, estás usando el método Add() para agregar los registros ?

    Lo que pasa es que estás almacenando los valores como texto, por lo que no te está ordenando correctamente, tienes que agregar los valores como un valor numérico (Int32) y te ordenará correctamente.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 28 de febrero de 2017 21:18
  • Public Class Form1
        Private Sub DataGridView1_SortCompare(sender As Object, e As DataGridViewSortCompareEventArgs) Handles DataGridView1.SortCompare
            Dim dgv As DataGridView = DirectCast(sender, DataGridView)
    
            If dgv.SortedColumn.Name = "Column1" Then
                Dim valor1 As Integer = CInt(dgv.Rows(e.RowIndex1).Cells("Column1").Value)
                Dim valor2 As Integer = CInt(dgv.Rows(e.RowIndex2).Cells("Column1").Value)
                e.SortResult = valor1.CompareTo(valor2)
            End If
        End Sub
    End Class

    Asume que el SortMode de la columna permanece en Automatic.

    no me funciona por alguna razon
    martes, 28 de febrero de 2017 22:18
  • asi es, estoy usando el add pero tambien necesito agregar los valores como texto por que hay algunas facturas que contienen letras y quiero que esas queden al final o al principio 
    martes, 28 de febrero de 2017 22:20
  • alguna idea¿?

    miércoles, 1 de marzo de 2017 22:11
  • Hola:
    Si hay facturas con letras, solo cabe una ordenacion como texto.
    Una posible solucion seria rellenando con ceros a la izquieda.
    Ejemplo
    00959
    00999
    01040
    01041
    1064A
    Un saludo desde Bilbo
    Carlos
    • Propuesto como respuesta Joyce_ACModerator jueves, 2 de marzo de 2017 15:25
    • Marcado como respuesta Joyce_ACModerator lunes, 6 de marzo de 2017 15:32
    • Desmarcado como respuesta RHCRD martes, 7 de marzo de 2017 0:38
    jueves, 2 de marzo de 2017 8:14
  • alguna idea¿?

    Por teoría, un algoritmo de ordenamiento permuta los valores por comparación (basado en una relación de orden) y la relación de orden es distinta entre un valor numérico y un valor alfanumérico. En un valor alfanumérico (o una cadena que contiene una representación numérica) los valores se comparan carácter por carácter y de izquierda a derecha, por tanto, es correcto esperar una secuencia ordenada bajo la forma: 1040, 1041, 1045, 959, 999.

    Tras lo dicho, si deseas ordenar valores con representación numérica como si se tratasen de valores numéricos entonces debes personalizar el proceso de ordenamiento, para ello puedes escribir en el evento 'SortCompare'  que se produce precisamente cuando se comparan dos valores de celda para producir una ordenación. Mencionas además que los valores de celda podrían contener valores alfanuméricos, hubiese sido conveniente nos adjuntes un ejemplo de valor alfanumérico para resolver el ordenamiento según el patrón, por ejemplo:

    Private Sub dgvFacturas_SortCompare(sender As Object, ...
    
    	If e.Column.Name = "NroFactura" Then 'Escribir el nombre de columna correcto
    
    		Dim Valor1 As Integer = 0
    		Dim Valor2 As Integer = 0
    
    		If Not Int32.TryParse(e.CellValue1, Valor1) Then '¿No contiene un valor numérico?
    			Valor1 = CInt(Regex.Match(e.CellValue1, "\d+").Value) 'Recuperar números
    		End If
    
    		If Not Int32.TryParse(e.CellValue2, Valor2) Then '¿No contiene un valor numérico?
    			Valor2 = CInt(Regex.Match(e.CellValue2, "\d+").Value) 'Recuperar números
    		End If
    
    		e.SortResult = Valor1.CompareTo(Valor2) 'Comparar valores para determinar el orden
    
    		e.Handled = True
    	End If
    
    End Sub

    En el ejemplo se desprecia la parte alfabética que para el ejemplo -convenientemente- es la constante F/., sin embargo debes adecuar el código según el valor alfanumérico que contengan las celdas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 3 de marzo de 2017 16:33