none
no puedo ordenar columna de un datagridview en VB.net RRS feed

  • Pregunta

  • Hola a todos gracias por la ayuda 

    no puedo ordenar una columna de un datagridview el cual lleno mediante programacion, la columna esta en sortmode programatic pero de igual manera no funciona en automatic

    este es el error

    jueves, 14 de enero de 2016 22:19

Respuestas

  • Prueba con esto.
    		Private _lastHeaderClicked As GridViewColumnHeader = Nothing
    		Private _lastDirection As ListSortDirection = ListSortDirection.Ascending
    
    		Private Sub GridViewColumnHeaderClickedHandler(ByVal sender As Object, ByVal e As RoutedEventArgs)
    			Dim headerClicked As GridViewColumnHeader = TryCast(e.OriginalSource, GridViewColumnHeader)
    			Dim direction As ListSortDirection
    
    			If headerClicked IsNot Nothing Then
    				If headerClicked.Role <> GridViewColumnHeaderRole.Padding Then
    					If headerClicked IsNot _lastHeaderClicked Then
    						direction = ListSortDirection.Ascending
    					Else
    						If _lastDirection = ListSortDirection.Ascending Then
    							direction = ListSortDirection.Descending
    						Else
    							direction = ListSortDirection.Ascending
    						End If
    					End If
    
    					Dim header As String = TryCast(headerClicked.Column.Header, String)
    					Sort(header, direction)
    
    					If direction = ListSortDirection.Ascending Then
    						headerClicked.Column.HeaderTemplate = TryCast(Resources("HeaderTemplateArrowUp"), DataTemplate)
    					Else
    						headerClicked.Column.HeaderTemplate = TryCast(Resources("HeaderTemplateArrowDown"), DataTemplate)
    					End If
    
    					' Remove arrow from previously sorted header
    					If _lastHeaderClicked IsNot Nothing AndAlso _lastHeaderClicked IsNot headerClicked Then
    						_lastHeaderClicked.Column.HeaderTemplate = Nothing
    					End If
    
    
    					_lastHeaderClicked = headerClicked
    					_lastDirection = direction
    				End If
    			End If
    		End Sub
    

    • Marcado como respuesta RHCRD viernes, 15 de enero de 2016 17:49
    viernes, 15 de enero de 2016 17:14
  • wow Oscar Perez 1234 eso se ve muy complicado de entender pero creo que hace algo ligeramente similar a lo que yo hice (casi igual de complejo) de todos modos te marcare como respuesta por que a simple vista se ve que si funciona.

    te dejo el codigo que yo utilice y si alguien puede decirme cual de las dos maneras es la mejor, teniendo en cuenta complejidad, eficiencia, intuitivo, buenas practicas etc, se los agradeceré.

    Public Class Informe
    'la ordenacion por default es ninguna
        Dim sortdirection As SortOrder = SortOrder.None
        Private Sub TablaInforme_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles TablaInforme.ColumnHeaderMouseClick
            With TablaInforme
    'si la columna seleccionada es la columna que quiero ordenar entonces...
                If e.ColumnIndex = ColumnaRepeticiones.Index Then
    'si no esta ordenada, ó esta ordenada descendentemente, la ordeno de manera ascendente
                    If sortdirection = SortOrder.None Or sortdirection = SortOrder.Descending Then
                        .Sort(New RowComparer(SortOrder.Ascending))
    'pongo la flecha de manera ascendente
                        .Columns.Item(e.ColumnIndex).HeaderCell.SortGlyphDirection = SortOrder.Ascending
    'la columna hora esta ordenada de manera ascendente
                        sortdirection = SortOrder.Ascending
    'el mismo codigo pero al revés
                    ElseIf sortdirection = SortOrder.Ascending Then
                        .Sort(New RowComparer(SortOrder.Descending))
                        .Columns.Item(e.ColumnIndex).HeaderCell.SortGlyphDirection = SortOrder.Descending
                        sortdirection = SortOrder.Descending
                    End If
                Else
    'si no es la columna que quiero ordenar, le quito la flecha
                    .Columns.Item(ColumnaRepeticiones.Index).HeaderCell.SortGlyphDirection = SortOrder.None
    'la columna ya no esta ordenada
                    sortdirection = SortOrder.None
                End If
            End With
        End Sub
    
    
    
    
    
    
    
    
    'esta clase la saque de internet que aun no entiendo al 100%
    
        Private Class RowComparer
            Implements System.Collections.IComparer
            Private sortOrderModifier As Integer = 1
    
            Public Sub New(sortOrder As SortOrder)
                If (sortOrder = sortOrder.Descending) Then
                    sortOrderModifier = -1
                ElseIf (sortOrder = sortOrder.Ascending) Then
                    sortOrderModifier = 1
                End If
            End Sub
    
            Public Function Compare(x As Object, y As Object) As Integer _
                Implements System.Collections.IComparer.Compare
    
                Dim row1 As DataGridViewRow = DirectCast(x, DataGridViewRow)
                Dim row2 As DataGridViewRow = DirectCast(y, DataGridViewRow)
                Dim compareResult As Integer
                Dim t1 As Integer
                Dim t2 As Integer
    'verifico que todos los valores sean numeros
                Try
                    t1 = Convert.ToInt32(row1.Cells(Informe.ColumnaRepeticiones.Index).Value)
                Catch ex As Exception
                    MsgBox("Error " & ex.Message)
                End Try
                Try
                    t2 = Convert.ToInt32(row2.Cells(Informe.ColumnaRepeticiones.Index).Value)
                Catch ex2 As Exception
                    MsgBox("EError " & ex2.Message)
                End Try
    'comparo los dos valores
                compareResult = Int(t1).CompareTo(t2)
    'si las dos celdas son iguales, la ordenacion se basara en la primera columna
                If (compareResult = 0) Then 
                    compareResult = Int(Convert.ToInt32(row1.Cells(Informe.ColumnaNumero.Index).Value)).CompareTo(Convert.ToInt32(row2.Cells(Informe.ColumnaNumero.Index).Value))
                End If
                Return compareResult * sortOrderModifier
            End Function
        End Class
    End Class


    • Editado RHCRD viernes, 15 de enero de 2016 17:48
    • Marcado como respuesta RHCRD viernes, 15 de enero de 2016 17:49
    viernes, 15 de enero de 2016 17:46

Todas las respuestas

  • Una consulta, de donde jalas tu información, de una BD ?
    jueves, 14 de enero de 2016 22:56
  • En todo caso prueba con esto.
    DataGridView.Sort(DataGridView.Columns(1), ListSortDirection.Ascending)

    jueves, 14 de enero de 2016 22:58
  • no, lleno el grid mediante programacion, no esta enlazado a absolutamente nada, ni un list ni un datatable ni una base de datos 
    jueves, 14 de enero de 2016 23:06
  • eso no funciona da el mismo error
    jueves, 14 de enero de 2016 23:06
  • Porque no pones el código en el evento load para que ya se cargue ordenado ???
    jueves, 14 de enero de 2016 23:14
  • DataGridView1.Sort(Salida, System.ComponentModel.ListSortDirection.Ascending)

    jueves, 14 de enero de 2016 23:15
  • por que no quiero que empiece con esa columna ordenada al principio, ya tengo otra columna ordenada desde el inicio
    jueves, 14 de enero de 2016 23:46
  • Buenos días RHCDR,

    Para ordenar por una columna determinada ejecuta esta orden :

     TablaInforme.Sort(TablaInforme.Columns("NombreDeLaColumnaAordenar"),System.ComponentModel.ListSortDirection.Ascending)


    Saludos, Javier J

    viernes, 15 de enero de 2016 7:55
  • cual es la diferencia?

    por que yo no entiendo por que con otras columnas el mismo codigo que estoy utilizando si funciona.

    para ser especifico, intente ordenarlas de forma atutomatica haciendo click en el header de la columna y me daba error, despues intente hacerlo de manera programatica y tambien me daba error.

    la columnarepeticiones es el nombre de la columna no es el header text ni es una variable

    columnarepeticiones es un DataGirdViewColumn

    viernes, 15 de enero de 2016 17:11
  • Prueba con esto.
    		Private _lastHeaderClicked As GridViewColumnHeader = Nothing
    		Private _lastDirection As ListSortDirection = ListSortDirection.Ascending
    
    		Private Sub GridViewColumnHeaderClickedHandler(ByVal sender As Object, ByVal e As RoutedEventArgs)
    			Dim headerClicked As GridViewColumnHeader = TryCast(e.OriginalSource, GridViewColumnHeader)
    			Dim direction As ListSortDirection
    
    			If headerClicked IsNot Nothing Then
    				If headerClicked.Role <> GridViewColumnHeaderRole.Padding Then
    					If headerClicked IsNot _lastHeaderClicked Then
    						direction = ListSortDirection.Ascending
    					Else
    						If _lastDirection = ListSortDirection.Ascending Then
    							direction = ListSortDirection.Descending
    						Else
    							direction = ListSortDirection.Ascending
    						End If
    					End If
    
    					Dim header As String = TryCast(headerClicked.Column.Header, String)
    					Sort(header, direction)
    
    					If direction = ListSortDirection.Ascending Then
    						headerClicked.Column.HeaderTemplate = TryCast(Resources("HeaderTemplateArrowUp"), DataTemplate)
    					Else
    						headerClicked.Column.HeaderTemplate = TryCast(Resources("HeaderTemplateArrowDown"), DataTemplate)
    					End If
    
    					' Remove arrow from previously sorted header
    					If _lastHeaderClicked IsNot Nothing AndAlso _lastHeaderClicked IsNot headerClicked Then
    						_lastHeaderClicked.Column.HeaderTemplate = Nothing
    					End If
    
    
    					_lastHeaderClicked = headerClicked
    					_lastDirection = direction
    				End If
    			End If
    		End Sub
    

    • Marcado como respuesta RHCRD viernes, 15 de enero de 2016 17:49
    viernes, 15 de enero de 2016 17:14
  • wow Oscar Perez 1234 eso se ve muy complicado de entender pero creo que hace algo ligeramente similar a lo que yo hice (casi igual de complejo) de todos modos te marcare como respuesta por que a simple vista se ve que si funciona.

    te dejo el codigo que yo utilice y si alguien puede decirme cual de las dos maneras es la mejor, teniendo en cuenta complejidad, eficiencia, intuitivo, buenas practicas etc, se los agradeceré.

    Public Class Informe
    'la ordenacion por default es ninguna
        Dim sortdirection As SortOrder = SortOrder.None
        Private Sub TablaInforme_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles TablaInforme.ColumnHeaderMouseClick
            With TablaInforme
    'si la columna seleccionada es la columna que quiero ordenar entonces...
                If e.ColumnIndex = ColumnaRepeticiones.Index Then
    'si no esta ordenada, ó esta ordenada descendentemente, la ordeno de manera ascendente
                    If sortdirection = SortOrder.None Or sortdirection = SortOrder.Descending Then
                        .Sort(New RowComparer(SortOrder.Ascending))
    'pongo la flecha de manera ascendente
                        .Columns.Item(e.ColumnIndex).HeaderCell.SortGlyphDirection = SortOrder.Ascending
    'la columna hora esta ordenada de manera ascendente
                        sortdirection = SortOrder.Ascending
    'el mismo codigo pero al revés
                    ElseIf sortdirection = SortOrder.Ascending Then
                        .Sort(New RowComparer(SortOrder.Descending))
                        .Columns.Item(e.ColumnIndex).HeaderCell.SortGlyphDirection = SortOrder.Descending
                        sortdirection = SortOrder.Descending
                    End If
                Else
    'si no es la columna que quiero ordenar, le quito la flecha
                    .Columns.Item(ColumnaRepeticiones.Index).HeaderCell.SortGlyphDirection = SortOrder.None
    'la columna ya no esta ordenada
                    sortdirection = SortOrder.None
                End If
            End With
        End Sub
    
    
    
    
    
    
    
    
    'esta clase la saque de internet que aun no entiendo al 100%
    
        Private Class RowComparer
            Implements System.Collections.IComparer
            Private sortOrderModifier As Integer = 1
    
            Public Sub New(sortOrder As SortOrder)
                If (sortOrder = sortOrder.Descending) Then
                    sortOrderModifier = -1
                ElseIf (sortOrder = sortOrder.Ascending) Then
                    sortOrderModifier = 1
                End If
            End Sub
    
            Public Function Compare(x As Object, y As Object) As Integer _
                Implements System.Collections.IComparer.Compare
    
                Dim row1 As DataGridViewRow = DirectCast(x, DataGridViewRow)
                Dim row2 As DataGridViewRow = DirectCast(y, DataGridViewRow)
                Dim compareResult As Integer
                Dim t1 As Integer
                Dim t2 As Integer
    'verifico que todos los valores sean numeros
                Try
                    t1 = Convert.ToInt32(row1.Cells(Informe.ColumnaRepeticiones.Index).Value)
                Catch ex As Exception
                    MsgBox("Error " & ex.Message)
                End Try
                Try
                    t2 = Convert.ToInt32(row2.Cells(Informe.ColumnaRepeticiones.Index).Value)
                Catch ex2 As Exception
                    MsgBox("EError " & ex2.Message)
                End Try
    'comparo los dos valores
                compareResult = Int(t1).CompareTo(t2)
    'si las dos celdas son iguales, la ordenacion se basara en la primera columna
                If (compareResult = 0) Then 
                    compareResult = Int(Convert.ToInt32(row1.Cells(Informe.ColumnaNumero.Index).Value)).CompareTo(Convert.ToInt32(row2.Cells(Informe.ColumnaNumero.Index).Value))
                End If
                Return compareResult * sortOrderModifier
            End Function
        End Class
    End Class


    • Editado RHCRD viernes, 15 de enero de 2016 17:48
    • Marcado como respuesta RHCRD viernes, 15 de enero de 2016 17:49
    viernes, 15 de enero de 2016 17:46