CLR: .Net / Mono / Boo / Otros CLR > VB .NET
Clase Comparador (ordenar Columnas Listview)
(1/1)
krnl64:
Alguna vez quisieron ordenar el contenido de un Listview en modo Details al pinchar encima del nombre de la columna y que se ordenara segun su contenido ?
Pues esta clase que les dejo les ayudará.
Puede ordenar texto, enteros, dni's y fechas Ascendente y Decendente.
Si usan esta clase "tal y como está" Respeten la documentacion XML por favor.
El uso de esta clase se resume en esta sentencia:
--- Código: Text --- Listview1.ListViewItemSorter = New Comparador(e.Column,Comparador.metodo.FechaAsc)
donde:
e.Column es un entero que representa la columna a ordenar
metodo.FechaAsc es el tipo de dato y la forma de orden
Por si las moscas, les comento que ese code se pondria en el evento Column_Click.
--- Código: Text --- ''' <summary>''' Ordena los Items de un ListView segun la columna que se le pase y el tipo de dato''' </summary>''' <remarks>Coded by Krnl64 '08</remarks> Public Class Comparador Implements System.Collections.IComparer ''' <summary>''' Tipo de Dato y Orden''' </summary> Public Enum metodo ''' <summary> ''' Texto en orden Ascendente ''' </summary> TextoAsc ''' <summary> ''' Texto en orden Descendente ''' </summary> TextoDesc ''' <summary> ''' DNI's sin tener en cuenta la letra Ascencente ''' </summary> DNIAsc ''' <summary> ''' DNI's sin tener en cuenta la letra Descendente ''' </summary> DNIDesc ''' <summary> ''' Fechas en orden Ascendente ''' </summary> FechaAsc ''' <summary> ''' Fechas en orden Descendente ''' </summary> FechaDesc ''' <summary> ''' Numeros en orden Ascendente ''' </summary> ''' <remarks></remarks> NumeroAsc ''' <summary> ''' Numeros en orden Descendente ''' </summary> NumeroDesc End Enum Private ordenar As metodo Private col As Integer ''' <summary> ''' Constructor ''' </summary> ''' <param name="columna">Entero que especifica la columna del Listview a ordenar</param> ''' <param name="datasort">Tipo de dato a ordenar y la forma</param> Public Sub New(ByVal columna As Integer, ByVal datasort As metodo) ordenar = datasort col = columna End Sub ''' <summary> ''' Comparador de varios tipos de datos ''' </summary> ''' <param name="x">Cualquier tipo de dato Soportado (Object)</param> ''' <param name="y">Cualquier tipo de dato Soportado (Object)</param> ''' <returns>Resultado de la comparacion</returns> Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare Select Case ordenar Case metodo.TextoAsc Return (String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)) Case metodo.TextoDesc Return (String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)) Case metodo.DNIAsc ' Puede parecer complicao pero lo que hace es coger el nº del dni sin letra y lo compara Return (CType(x, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(x, ListViewItem).SubItems(col).Text.Length - 1, Integer)) - CType(y, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(y, ListViewItem).SubItems(col).Text.Length - 1, Integer))) Case metodo.DNIDesc Return (CType(y, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(y, ListViewItem).SubItems(col).Text.Length - 1, Integer)) - CType(x, ListViewItem).SubItems(col).Text.Substring(0, CType(CType(x, ListViewItem).SubItems(col).Text.Length - 1, Integer))) Case metodo.NumeroAsc Return (CInt(CType(x, ListViewItem).SubItems(col).Text) - CInt(CType(y, ListViewItem).SubItems(col).Text)) Case metodo.NumeroDesc Return (CInt(CType(y, ListViewItem).SubItems(col).Text) - CInt(CType(x, ListViewItem).SubItems(col).Text)) Case metodo.FechaAsc Return (DateTime.Compare(DateTime.Parse(CDate(CType(x, ListViewItem).SubItems(col).Text)), DateTime.Parse(CDate(CType(y, ListViewItem).SubItems(col).Text)))) Case metodo.FechaDesc Return (DateTime.Compare(DateTime.Parse(CDate(CType(y, ListViewItem).SubItems(col).Text)), DateTime.Parse(CDate(CType(x, ListViewItem).SubItems(col).Text)))) End Select End Function ''' <summary> ''' Destructor ''' </summary> Protected Overrides Sub Finalize() ordenar = 0 col = 0 MyBase.Finalize() End Sub End Class
Navegación
Ir a la versión completa