Cómo ordenar un control ListView por una columna en Visual Basic .NET o en Visual Basic 2005

Seleccione idioma Seleccione idioma
Id. de artículo: 319399 - Ver los productos a los que se aplica este artículo
Para obtener una versión de este artículo para Microsoft Visual C# .NET, vea 319401.
Para obtener una versión de Microsoft Visual Basic 6.0 de este artículo, vea 170884.
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo paso a paso se describe cómo ordenar un control ListView por una columna en una aplicación de Visual Basic .NET o Visual Basic 2005.

Cuando trabaja con un control ListView, puede desear ordenar su contenido en función de una columna específica. Un ejemplo de este tipo de funcionalidad ocurre en un programa del Explorador de Windows al ver el contenido de una carpeta del disco duro. En la vista Detalles, el Explorador de Windows muestra información acerca de los archivos de la carpeta. Por ejemplo, se ve el nombre, tamaño y tipo del archivo, y la fecha en que se modificó. Cuando hace clic en uno de los encabezados de columna, la lista se ordena de forma ascendente según esa columna. Cuando hace clic en el mismo encabezado de columna de nuevo, la columna se ordena de forma descendente.

El ejemplo de este artículo define una clase que implementa la interfaz IComparer. Además, en este ejemplo se usa el método Compare de la clase CaseInsenstiveComparer para realizar la comparación real de los elementos. Observe que este método de comparación no distingue entre mayúsculas y minúsculas ("Manzana" se considera que es lo mismo que "manzana"). Además, observe que todas las columnas de este ejemplo se ordenan como "texto". Si desea ordenar de forma diferente (por ejemplo, numéricamente), puede reemplazar la línea de código siguiente con el método de ordenación que desee usar:
compareResult = ObjectCompare.Compare(listviewX.SubItems(ColumnToSort).Text, listviewY.SubItems(ColumnToSort).Text)
				

Cómo generar el proyecto de ejemplo

  1. Cree un nuevo proyecto de aplicación Windows de Visual Basic .NET o Visual Basic 2005. De manera predeterminada se creará Form1.

    Nota
    Debe cambiar el código en Visual Basic 2005. De forma predeterminada, Visual Basic crea dos archivos para el proyecto cuando se crea en Windows Forms. Si el formulario se denomina Form1, los dos archivos que lo representan se denominan Form1.vb y Form1.Designer.vb. Debe escribir el código en el archivo Form1.vb. El Diseñador de Windows Forms escribe el código en el archivo Form1.Designer.vb. El Diseñador de Windows Forms utiliza la palabra clave partial para dividir la aplicación de Form1 en dos archivos independientes. Este comportamiento evita que el código generado por el diseñador se mezcle con el suyo.

    Para obtener más información acerca de las mejoras del nuevo lenguaje de Visual Basic 2005, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnhcvs04/html/vs04k1.asp
    Para obtener más información acerca de las clases parciales y el Diseñador de Windows Forms, visite el siguiente sitio Web de MSDN:
    http://msdn2.microsoft.com/en-us/library/ms171843.aspx
  2. Agregue un control ListView a Form1. Asigne al formulario un ancho y un alto.
  3. Pegue el código siguiente en la clase de este formulario:
    Private lvwColumnSorter As ListViewColumnSorter
    					
  4. Pegue el código siguiente en el constructor del formulario, después de la llamada al método InitializeComponent:
    ' Crear una instancia de una ordenación de columna ListView y asignarla ' al control ListView. lvwColumnSorter = New ListViewColumnSorter() Me.ListView1.ListViewItemSorter = lvwColumnSorter
    					
  5. Pegue el código siguiente en el evento Load del formulario:
    Dim columnheader As ColumnHeader    ' Se usa para crear encabezados de columna. Dim listviewitem As ListViewItem    ' Se usa para crear elementos de ListView.
    
    'Asegúrese de que la vista se establece para mostrar detalles. ListView1.View = View.Details
    
    ' Crear algunos elementos de ListView con el nombre y apellidos. listviewitem = New ListViewItem("Mike") listviewitem.SubItems.Add("Nash") Me.ListView1.Items.Add(listviewitem)
    
    listviewitem = New ListViewItem("Kim") listviewitem.SubItems.Add("Abercrombie") Me.ListView1.Items.Add(listviewitem)
    
    listviewitem = New ListViewItem("Sunil") listviewitem.SubItems.Add("Koduri") Me.ListView1.Items.Add(listviewitem)
    
    listviewitem = New ListViewItem("Birgit") listviewitem.SubItems.Add("Seidl") Me.ListView1.Items.Add(listviewitem)
    
    ' Crear algunos encabezados de columna para los datos. columnheader = New ColumnHeader() columnheader.Text = "Nombre" Me.ListView1.Columns.Add(columnheader)
    
    columnheader = New ColumnHeader() columnheader.Text = "Apellidos" Me.ListView1.Columns.Add(columnheader)
    
    ' Recorrer el bucle y asignar el tamaño del encabezado de la columna para que quepa el texto. For Each columnheader In Me.ListView1.Columns columnheader.Width = -2 Next
    					
  6. Pegue el código siguiente en el evento ColumnClick de ListView:
    ' Determinar si la columna en la que se hizo clic ya es la que se está ordenando. If (e.Column = lvwColumnSorter.SortColumn) Then ' Revertir la dirección de ordenación actual de esta columna. If (lvwColumnSorter.Order = SortOrder.Ascending) Then lvwColumnSorter.Order = SortOrder.Descending Else lvwColumnSorter.Order = SortOrder.Ascending End If Else ' Establecer el número de columna que se va a ordenar; de forma predeterminada, en orden ascendente. lvwColumnSorter.SortColumn = e.Column lvwColumnSorter.Order = SortOrder.Ascending End If
    
    ' Realizar la ordenación con estas nuevas opciones de ordenación. Me.ListView1.Sort()
    					
  7. En el menú Proyecto, haga clic en Agregar clase para agregar una clase nueva al proyecto.
  8. Reemplace todo el código predeterminado de la clase nueva con el código siguiente:
    Imports System.Collections Imports System.Windows.Forms
    
    Public Class ListViewColumnSorter Implements System.Collections.IComparer
    
        Private ColumnToSort As Integer Private OrderOfSort As SortOrder Private ObjectCompare As CaseInsensitiveComparer
    
        Public Sub New() ' Inicializar la columna a '0'. ColumnToSort = 0
    
            ' Inicializar el tipo de orden en 'ninguno'. OrderOfSort = SortOrder.None
    
            ' Inicializar el objeto CaseInsensitiveComparer. ObjectCompare = New CaseInsensitiveComparer() End Sub
    
        Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare Dim compareResult As Integer Dim listviewX As ListViewItem Dim listviewY As ListViewItem
    
            ' Convertir el tipo de los objetos para compararlos con los objetos ListViewItem. listviewX = CType(x, ListViewItem) listviewY = CType(y, ListViewItem)
    
            ' Comparar los dos elementos. compareResult = ObjectCompare.Compare(listviewX.SubItems(ColumnToSort).Text, listviewY.SubItems(ColumnToSort).Text)
    
            ' Calcular el valor devuelto correcto según la comparación del objeto. If (OrderOfSort = SortOrder.Ascending) Then ' Se selecciona el orden ascendente, y se devuelve el 'resultado típico de la operación de ' comparación. Return compareResult ElseIf (OrderOfSort = SortOrder.Descending) Then ' Se selecciona el orden descendente, y se devuelve el resultado negativo de ' la operación de comparación. Return (-compareResult) Else ' Return '0' para indicar que son iguales. Return 0 End If End Function
    
        Public Property SortColumn() As Integer Set(ByVal Value As Integer) ColumnToSort = Value End Set
    
            Get Return ColumnToSort End Get End Property
    
        Public Property Order() As SortOrder Set(ByVal Value As SortOrder) OrderOfSort = Value End Set
    
            Get Return OrderOfSort End Get End Property End Class
    					
  9. Guarde el proyecto de ejemplo, genérelo y, a continuación, ejecútelo.
  10. Haga clic en los diversos encabezados de columna en el control ListView. Cuando hace clic en el encabezado, el contenido del control ListView se ordena de forma ascendente según esa columna. Cuando hace clic en el mismo encabezado de columna de nuevo, la columna se ordena de forma descendente.

Propiedades

Id. de artículo: 319399 - Última revisión: martes, 03 de octubre de 2006 - Versión: 3.3
La información de este artículo se refiere a:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave: 
kbhowtomaster kbvs2005applies kbvs2005swept KB319399

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com