Ordenar las columnas de un ListView pulsando en sus títulos
Artículo por Club Developers · 11 mayo 2006
2066 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.
Ahora tendremos que interceptar el clic en las columnas (evento ColumnClick) y instanciar esta clase.
Nota: se ha hecho una comparación de cadenas. La implementación será distinta si queremos comparar números por ejemplo.
Para hacerlo, tendremos que crear una clase que derive de IComparer implmentando el método Compare.
vbnet
Class ListViewItemComparer   Implements IComparer   Private col As Integer   Private sortOrder As SortOrder   Public Sub New()     col = 0     sortOrder = Windows.Forms.SortOrder.Ascending   End Sub   Public Sub New(ByVal column As Integer)     col = column     sortOrder = Windows.Forms.SortOrder.Ascending   End Sub   Public Sub New(ByVal column As Integer, ByVal s As SortOrder)     col = column     sortOrder = s   End Sub   Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare     If sortOrder = Windows.Forms.SortOrder.Ascending Then       Return String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)     Else       Return String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)     End If   End Function End Class
Ahora tendremos que interceptar el clic en las columnas (evento ColumnClick) y instanciar esta clase.
vbnet
  Private Sub ListView1_ColumnClick(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick     If Me.ListView1.Sorting = SortOrder.Ascending Then       Me.ListView1.Sorting = SortOrder.Descending     Else       Me.ListView1.Sorting = SortOrder.Ascending     End If     Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView1.Sorting)   End Sub
Nota: se ha hecho una comparación de cadenas. La implementación será distinta si queremos comparar números por ejemplo.