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

2097 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.



csharp
  1. class ListViewItemComparer : IComparer
  2. {
  3.     private int col;
  4.     private SortOrder sortOrder;
  5.     public ListViewItemComparer()
  6.     {
  7.         col = 0;
  8.         sortOrder = Windows.Forms.SortOrder.Ascending;
  9.     }
  10.     public ListViewItemComparer(int column)
  11.     {
  12.         col = column;
  13.         sortOrder = Windows.Forms.SortOrder.Ascending;
  14.     }
  15.     public ListViewItemComparer(int column, SortOrder s)
  16.     {
  17.         col = column;
  18.         sortOrder = s;
  19.     }
  20.     public int Compare(object x, object y)
  21.     {
  22.         if (sortOrder == Windows.Forms.SortOrder.Ascending)
  23.         { return string.Compare(((ListViewItem)(x)).SubItems(col).Text, ((ListViewItem)(y)).SubItems(col).Text);}
  24.         else
  25.         { return string.Compare(((ListViewItem)(y)).SubItems(col).Text, ((ListViewItem)(x)).SubItems(col).Text);}
  26.     }
  27. }



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



csharp
  1.   private void ListView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
  2.     {
  3.         if (this.ListView1.Sorting == SortOrder.Ascending)
  4.         { this.ListView1.Sorting = SortOrder.Descending;}
  5.         else
  6.         { this.ListView1.Sorting = SortOrder.Ascending;}
  7.  
  8.         this.ListView1.ListViewItemSorter = new ListViewItemComparer(e.Column, this.ListView1.Sorting);
  9.     }



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