Ordenar las columnas de un ListView pulsando en sus títulos
Artículo por Club Developers · 28 agosto 2006
2196 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.
csharp
class ListViewItemComparer : IComparer {   private int col;   private SortOrder sortOrder;   public ListViewItemComparer()   {     col = 0;     sortOrder = Windows.Forms.SortOrder.Ascending;   }   public ListViewItemComparer(int column)   {     col = column;     sortOrder = Windows.Forms.SortOrder.Ascending;   }   public ListViewItemComparer(int column, SortOrder s)   {     col = column;     sortOrder = s;   }   public int Compare(object x, object y)   {     if (sortOrder == Windows.Forms.SortOrder.Ascending)     { return string.Compare(((ListViewItem)(x)).SubItems(col).Text, ((ListViewItem)(y)).SubItems(col).Text);}     else     { return string.Compare(((ListViewItem)(y)).SubItems(col).Text, ((ListViewItem)(x)).SubItems(col).Text);}   } }
Ahora tendremos que interceptar el clic en las columnas (evento ColumnClick) y instanciar esta clase.
csharp
 private void ListView1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)   {     if (this.ListView1.Sorting == SortOrder.Ascending)     { this.ListView1.Sorting = SortOrder.Descending;}     else     { this.ListView1.Sorting = SortOrder.Ascending;}     this.ListView1.ListViewItemSorter = new ListViewItemComparer(e.Column, this.ListView1.Sorting);   }
Nota: se ha hecho una comparación de cadenas. La implementación será distinta si queremos comparar números por ejemplo.