• Lunes 23 de Diciembre de 2024, 09:44

Autor Tema:  Clase Comparador (ordenar Columnas Listview)  (Leído 3715 veces)

krnl64

  • Miembro activo
  • **
  • Mensajes: 72
    • Ver Perfil
Clase Comparador (ordenar Columnas Listview)
« en: Miércoles 7 de Mayo de 2008, 06:02 »
0
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
  1.  
  2.  Listview1.ListViewItemSorter = New Comparador(e.Column,Comparador.metodo.FechaAsc)
  3.  
  4.  

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
  1.  
  2.  
  3. ''' <summary>
  4. ''' Ordena los Items de un ListView segun la columna que se le pase y el tipo de dato
  5. ''' </summary>
  6. ''' <remarks>Coded by Krnl64 '08</remarks>
  7.  Public Class Comparador
  8.  
  9.     Implements System.Collections.IComparer
  10.  
  11. ''' <summary>
  12. ''' Tipo de Dato y Orden
  13. ''' </summary>
  14.     Public Enum metodo
  15.     ''' <summary>
  16.     ''' Texto en orden Ascendente
  17.     ''' </summary>
  18.     TextoAsc
  19.     ''' <summary>
  20.     ''' Texto en orden Descendente
  21.     ''' </summary>
  22.     TextoDesc
  23.     ''' <summary>
  24.     ''' DNI's sin tener en cuenta la letra Ascencente
  25.     ''' </summary>
  26.     DNIAsc
  27.     ''' <summary>
  28.     ''' DNI's sin tener en cuenta la letra Descendente
  29.     ''' </summary>
  30.     DNIDesc
  31.     ''' <summary>
  32.     ''' Fechas en orden Ascendente
  33.     ''' </summary>
  34.     FechaAsc
  35.     ''' <summary>
  36.     ''' Fechas en orden Descendente
  37.     ''' </summary>
  38.     FechaDesc
  39.     ''' <summary>
  40.     ''' Numeros en orden Ascendente
  41.     ''' </summary>
  42.     ''' <remarks></remarks>
  43.     NumeroAsc
  44.     ''' <summary>
  45.     ''' Numeros en orden Descendente
  46.     ''' </summary>
  47.     NumeroDesc
  48.  
  49.     End Enum
  50.  
  51.  
  52.     Private ordenar As metodo
  53.     Private col As Integer
  54.  
  55.         ''' <summary>
  56.         ''' Constructor
  57.         ''' </summary>
  58.         ''' <param name="columna">Entero que especifica la columna del Listview a ordenar</param>
  59.         ''' <param name="datasort">Tipo de dato a ordenar y la forma</param>
  60.         Public Sub New(ByVal columna As Integer, ByVal datasort As metodo)
  61.         ordenar = datasort
  62.         col = columna
  63.         End Sub
  64.  
  65.         ''' <summary>
  66.         ''' Comparador de varios tipos de datos
  67.         ''' </summary>
  68.         ''' <param name="x">Cualquier tipo de dato Soportado (Object)</param>
  69.         ''' <param name="y">Cualquier tipo de dato Soportado (Object)</param>
  70.         ''' <returns>Resultado de la comparacion</returns>
  71.         Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
  72.  
  73.                Select Case ordenar
  74.  
  75.                             Case metodo.TextoAsc
  76.  
  77.                                             Return (String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text))
  78.                             Case metodo.TextoDesc
  79.                                             Return (String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text))
  80.  
  81.                             Case metodo.DNIAsc ' Puede parecer complicao pero lo que hace es coger el nº del dni sin letra y lo compara
  82.                                             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)))
  83.  
  84.                             Case metodo.DNIDesc
  85.                                             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)))
  86.  
  87.                             Case metodo.NumeroAsc
  88.                                             Return (CInt(CType(x, ListViewItem).SubItems(col).Text) - CInt(CType(y, ListViewItem).SubItems(col).Text))
  89.  
  90.                             Case metodo.NumeroDesc
  91.                                             Return (CInt(CType(y, ListViewItem).SubItems(col).Text) - CInt(CType(x, ListViewItem).SubItems(col).Text))
  92.  
  93.                             Case metodo.FechaAsc
  94.                                             Return (DateTime.Compare(DateTime.Parse(CDate(CType(x, ListViewItem).SubItems(col).Text)), DateTime.Parse(CDate(CType(y, ListViewItem).SubItems(col).Text))))
  95.  
  96.                             Case metodo.FechaDesc
  97.                                             Return (DateTime.Compare(DateTime.Parse(CDate(CType(y, ListViewItem).SubItems(col).Text)), DateTime.Parse(CDate(CType(x, ListViewItem).SubItems(col).Text))))
  98.  
  99.                 End Select
  100.  
  101.         End Function
  102.  
  103.         ''' <summary>
  104.         ''' Destructor
  105.         ''' </summary>
  106.         Protected Overrides Sub Finalize()
  107.             ordenar = 0
  108.             col = 0
  109.             MyBase.Finalize()
  110.         End Sub
  111.  
  112. End Class
  113.  
  114.