Ordenar las columnas de un ListView pulsando en sus títulos

1999 vistas

La clase ListView tiene una propiedad ListViewItemSorter de tipo IComparer. Ésta permite implementar su propia gestión de ordenación.

Para hacerlo, tendremos que crear una clase que derive de IComparer implmentando el método Compare.



vbnet
  1. Class ListViewItemComparer
  2.     Implements IComparer
  3.     Private col As Integer
  4.     Private sortOrder As SortOrder
  5.  
  6.     Public Sub New()
  7.         col = 0
  8.         sortOrder = Windows.Forms.SortOrder.Ascending
  9.     End Sub
  10.  
  11.     Public Sub New(ByVal column As Integer)
  12.         col = column
  13.         sortOrder = Windows.Forms.SortOrder.Ascending
  14.     End Sub
  15.  
  16.     Public Sub New(ByVal column As Integer, ByVal s As SortOrder)
  17.         col = column
  18.         sortOrder = s
  19.     End Sub
  20.  
  21.     Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
  22.         If sortOrder = Windows.Forms.SortOrder.Ascending Then
  23.             Return String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
  24.         Else
  25.             Return String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)
  26.         End If
  27.  
  28.     End Function
  29.  
  30. End Class



Ahora tendremos que interceptar el clic en las columnas (evento ColumnClick) y instanciar esta clase.



vbnet
  1.     Private Sub ListView1_ColumnClick(ByVal sender As System.Object, _
  2. ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
  3.         If Me.ListView1.Sorting = SortOrder.Ascending Then
  4.             Me.ListView1.Sorting = SortOrder.Descending
  5.         Else
  6.             Me.ListView1.Sorting = SortOrder.Ascending
  7.         End If
  8.         Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView1.Sorting)
  9.     End Sub



Nota: se ha hecho una comparación de cadenas. La implementación será distinta si queremos comparar números por ejemplo.