Ayuda con SORT en ListView

14/09/2005 - 08:09 por Francisco | Informe spam
Que tal amigos? estoy utilizando un codigo que consegui en esta direccion:

http://msdn.microsoft.com/library/d...viewitemso rtertopic.asp

para ordenar (sort) el contenido del listview al hacer click en el
encabezado de cada columna. El problema que tengo es que cuando tengo en la
lista numeros como: 22,30,10,20,105,222,11 , por ejemplo, quedan ordenados de
la siguiente manera: 10,11,105,20,222,30 y asi sucesivamente.

Y, cuando se trata de fechas, estas quedan ordenadas tomando en cuenta solo
el dia, sin importar el mes o el año, algo asi como: 01/06/2002, 02/05/2001,
05/01/2003, etc.

Espero saber si me pueden ayudar en algo o si necesitan que les proporcione
mas informacion de mi problema.

Gracias
Francisco
 

Leer las respuestas

#1 Carlos Gómez
15/09/2005 - 07:16 | Informe spam
Aquí tienes un ejemplo:

Option Strict On
Option Explicit On

Imports System.Windows.Forms

Public Class CompararCadenas
Implements IComparer
Implements IDisposable

Dim indice As Integer

'Constructor
Sub New(ByVal columna As Integer)
Me.indice = columna
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As
Integer Implements System.Collections.IComparer.Compare
Dim item1 As ListViewItem = CType(x, ListViewItem)
Dim item2 As ListViewItem = CType(y, ListViewItem)
Try
Compare = String.Compare(item1.SubItems(indice).Text,
item2.SubItems(indice).Text)
Catch ex As Exception
End Try
End Function

End Class

Option Strict On
Option Explicit On

Imports System.Windows.Forms

Public Class CompararFechas
Implements IComparer
Implements IDisposable

Dim indice As Integer

'Constructor
Sub New(ByVal columna As Integer)
Me.indice = columna
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As
Integer Implements System.Collections.IComparer.Compare
Dim item1 As ListViewItem = CType(x, ListViewItem)
Dim item2 As ListViewItem = CType(y, ListViewItem)
Dim str1, str2 As String
Dim ban1, ban2 As Boolean
Try
If Not IsDate(item1.SubItems(indice).Text) Then
str1 = item1.SubItems(indice).Text
item1.SubItems(indice).Text = #1/1/1900#.ToString
ban1 = True
End If
If Not IsDate(item2.SubItems(indice).Text) Then
str2 = item2.SubItems(indice).Text
item2.SubItems(indice).Text = #1/1/1900#.ToString
ban2 = True
End If
Compare = (Date.Compare(Date.Parse(item1.SubItems(indice).Text),
Date.Parse(item2.SubItems(indice).Text)))
If ban1 Then
item1.SubItems(indice).Text = str1
End If
If ban2 Then
item2.SubItems(indice).Text = str2
End If
Catch
End Try
End Function

End Class

Option Strict On
Option Explicit On

Imports System.Windows.Forms

Public Class CompararNumeros
Implements IComparer
Implements IDisposable

Dim indice As Integer

'Constructor
Sub New(ByVal columna As Integer)
Me.indice = columna
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As
Integer Implements System.Collections.IComparer.Compare
Dim it1, it2 As Boolean
Dim str1, str2 As String
Dim item1 As ListViewItem = CType(x, ListViewItem)
Dim item2 As ListViewItem = CType(y, ListViewItem)
Try
If Not IsNumeric(item1.SubItems(indice).Text) Then
str1 = item1.SubItems(indice).Text
it1 = True
item1.SubItems(indice).Text = "0"
End If
If Not IsNumeric(item2.SubItems(indice).Text) Then
str2 = item2.SubItems(indice).Text
it2 = True
item2.SubItems(indice).Text = "0"
End If
Compare = Math.Sign(CLng(item1.SubItems(indice).Text) -
CLng(item2.SubItems(indice).Text))
If it1 Then item1.SubItems(indice).Text = str1
If it2 Then item2.SubItems(indice).Text = str2
Catch
End Try
End Function
End Class


y ahora, en el formulario:
Suponemos que tienes un listView1, con 3 columnas: la primera de texto,
la segunda de numeros y la tercera de fechas

Ordenar por nombre:
ListView1.ListViewItemSorter=new CompararCadenas(0)
ListView1.Sort()

Ordenar numeros:
ListView1.ListViewItemSorter=new CompararNumeros(1)
ListView1.Sort()

Ordenar fechas:
ListView1.ListViewItemSorter=new CompararFechas(2)
ListView1.Sort()

Preguntas similares