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

[0] Índice de Mensajes

Ir a la versión completa