usando como base el ejemplo anterior, veremos como podemos en, visual basic .net, ordenar los datos del listview por alguna de sus columnas.
Al proyecto anterior le agregaremos dos botones para seleccionar cual es el orden deseado. Así como se ve en la imagen siguiente:

Luego en el mismo código del formulario vamos a crear dos clases nuevas (OrdenarPorNombre y Ordenar por Tamaño), y en el los eventos lick de los botones seteamos la propiedad ListViewItemSorter del listview con una nueva instancia de la clase correspondiente al orden seleccionado. El código es breve, así que no costará mucho analizarlo. A continuación les dejo todo el código del formulario:
Imports System.IO
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim d As New DirectoryInfo("C:\Windows")
ListView1.View = View.Details
ListView1.FullRowSelect = True
ListView1.BeginUpdate()
ListView1.Items.Clear()
For Each f As FileInfo In d.GetFiles
Dim item As New ListViewItem(f.Name)
item.SubItems.Add(f.Length)
item.SubItems.Add(f.CreationTime)
item.SubItems.Add(f.LastWriteTime)
item.SubItems.Add(f.LastAccessTime)
ListView1.Items.Add(item)
Next
ListView1.EndUpdate()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'Ordenar por nombre
ListView1.ListViewItemSorter = New ordenarPorNombre
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
'Ordenar por tamaño
ListView1.ListViewItemSorter = New ordenarPorTamaño
End Sub
End Class
Class ordenarPorNombre
Implements IComparer
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) Return String.Compare(item1.Text, item2.Text) End Function End Class
Class ordenarPorTamaño Implements IComparer 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) Return Math.Sign(CLng(item1.SubItems(1).Text) - CLng(item2.SubItems(1).Text)) End Function End Class
Como siempre, espero que el código les sea de utilidad.
Información Bitacoras.com…
Valora en Bitacoras.com: usando como base el ejemplo anterior, veremos como podemos en, visual basic .net, ordenar los datos del listview por alguna de sus columnas. Al proyecto anterior le agregaremos dos botones para seleccionar cual es el orden de…..
Ok, muy bien, pero… esto solo ordena ascendentemente y para que ordene ascendente y descendente, dandole el click en la cabecera de la columna?
Hola Laura:
Para ordenar por nombre en forma descendente solo tienes que invertir las variables que se devuelven en la clase OrdenarPorNombre… Tienes que cambiar:
Return String.Compare(item1.Text, item2.Text)
por esto:
Return String.Compare(item2.Text, item1.Text)
y en el caso del orden numérico debes invertir el signo devuelto por la case ordenarPorTamaño, cambiando esto:
Return Math.Sign(CLng(item1.SubItems(1).Text) – CLng(item2.SubItems(1).Text))
por esto:
Return Math.Sign()CLng(item1.SubItems(1).Text) – CLng(item2.SubItems(1).Text)) * -1)
y para finalizar te cuento que el orden dandole clic en la columna del listview no lo comento aquí por que quiero dedicarle un artículo independiente.
Saludos, Eliseo
Y como lo ordenas por alguno de los campos fecha en forma descendente por ejemplo Fecha Creación.
Agrega la siguiente clase y asignala a el botón que tu quieras.
Class ordenarPorFechaCreacion
Implements IComparer
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)
Return Date.Compare(Date.Parse(item1.SubItems(2).Text), Date.Parse(item2.SubItems(2).Text))
End Function
End Class
Hola gente.
en C# como sería la sentencia para realizar el mismo ordenamiento?
[...] [...]
dobry start
en el caso si tengo una lista asi
23=5+5+13
5=1+1+1+2
4=3+1
etc…..
como puedo hacer que me lo ordene por los numeros que si un resultado me es 231=100+100+31 no lo ponga despues del 23=5+5+13
Buenas tardes,
Disculpen la molestia, pero sabrán como se puede ordenar por dos columnas al mismo tiempo? algo así:
X Y Z
a b a ->1
b a a ->2
a a b ->3
y quede:
X Y Z
a a b ->3
a b a ->1
b a a ->2
Súper agradecido si pudieran ayudarme y si no, igual gracias por postear información que también me resultó útil.
Y si lo quiero por fechas….. que no sean de creacion solo por fechas