Ordenar datos en un ListView

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.



11 Responses to “Ordenar datos en un ListView”

  1. 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…..

  2. Laura dice:

    Ok, muy bien, pero… esto solo ordena ascendentemente y para que ordene ascendente y descendente, dandole el click en la cabecera de la columna?

  3. Eliseo dice:

    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

  4. Oscar dice:

    Y como lo ordenas por alguno de los campos fecha en forma descendente por ejemplo Fecha Creación.

    • Eliseo dice:

      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

  5. Roxana dice:

    Hola gente.
    en C# como sería la sentencia para realizar el mismo ordenamiento?

  6. bebrafraptaug dice:

    dobry start

  7. Josue dice:

    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

  8. Victor dice:

    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.

  9. Cinthia dice:

    Y si lo quiero por fechas….. que no sean de creacion solo por fechas

Comentar