Usare Visual C# per ordinare un controllo ListView usando una colonna

Questo articolo fornisce informazioni su come ordinare un controllo ListView usando una colonna in Visual C# e fornisce anche un esempio di codice per illustrare i metodi.

Versione originale del prodotto: Oggetto visivo C#
Numero KB originale: 319401

Riepilogo

Quando si usa il controllo ListView, è possibile ordinarne il contenuto in base a una colonna specifica. Un esempio di questo tipo di funzionalità si verifica in un programma di Esplora risorse quando si visualizza il contenuto di una cartella nel disco rigido. Nella visualizzazione Dettagli Esplora risorse visualizza informazioni sui file in tale cartella. Ad esempio, vengono visualizzati il nome del file, le dimensioni del file, il tipo di file e la data in cui il file è stato modificato. Quando si fa clic su una delle intestazioni di colonna, l'elenco viene ordinato in ordine crescente in base a tale colonna. Quando si fa di nuovo clic sulla stessa intestazione di colonna, la colonna viene ordinata in ordine decrescente.

L'esempio in questo articolo definisce una classe che eredita dall'interfaccia IComparer . In questo esempio viene inoltre utilizzato il Compare metodo della CaseInsenstiveComparer classe per eseguire il confronto effettivo degli elementi.

Nota

  • Questo metodo di confronto non fa distinzione tra maiuscole e minuscole.
  • Tutte le colonne in questo esempio vengono ordinate in modo testo .

Se si vuole ordinare in modo diverso, ad esempio numericamente, è possibile sostituire la riga di codice seguente con qualsiasi approccio all'ordinamento che si vuole usare:

ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);

Passaggi per compilare il progetto di esempio

  1. Creare un nuovo progetto di applicazione Windows Visual C#. Form1 viene creato per impostazione predefinita.

  2. Aggiungere un controllo ListView a Form1. Ridimensionare la forma in modo che sia larga diversi pollici da diversi pollici di altezza.

  3. Incollare il codice seguente nella classe per il modulo:

    private ListViewColumnSorter lvwColumnSorter;
    
  4. Incollare il codice seguente nel costruttore per il form, dopo la chiamata al InitializeComponent metodo :

    // Create an instance of a ListView column sorter and assign it
    // to the ListView control.
    lvwColumnSorter = new ListViewColumnSorter();
    this.listView1.ListViewItemSorter = lvwColumnSorter;
    
  5. Incollare il codice seguente nell'evento Load per il modulo:

    ColumnHeader columnheader;// Used for creating column headers.
    ListViewItem listviewitem;// Used for creating listview items.
    
    // Ensure that the view is set to show details.
    listView1.View = View.Details;
    
    // Create some listview items consisting of first and last names.
    listviewitem = new ListViewItem("John");
    listviewitem.SubItems.Add("Smith");
    this.listView1.Items.Add(listviewitem);
    
    listviewitem = new ListViewItem("Bob");
    listviewitem.SubItems.Add("Taylor");
    this.listView1.Items.Add(listviewitem);
    
    listviewitem = new ListViewItem("Kim");
    listviewitem.SubItems.Add("Zimmerman");
    this.listView1.Items.Add(listviewitem);
    
    listviewitem = new ListViewItem("Olivia");
    listviewitem.SubItems.Add("Johnson");
    this.listView1.Items.Add(listviewitem);
    
    // Create some column headers for the data.
    columnheader = new ColumnHeader();
    columnheader.Text = "First Name";
    this.listView1.Columns.Add(columnheader);
    
    columnheader = new ColumnHeader();
    columnheader.Text = "Last Name";
    this.listView1.Columns.Add(columnheader);
    
    // Loop through and size each column header to fit the column header text.
    foreach (ColumnHeader ch in this.listView1.Columns)
    {
        ch.Width = -2;
    }
    

    Nota

    Il codice deve essere modificato in Visual Studio. Quando si crea un progetto Windows Forms, Visual C# aggiunge una maschera al progetto per impostazione predefinita. Questo modulo è denominato Form1. I due file che rappresentano il modulo sono denominati Form1.cs e Form1.designer.cs. Si scrive il codice in Form1.cs. Il file Designer.cs è il percorso in cui il Windows Forms Designer scrive il codice che implementa tutte le azioni eseguite aggiungendo controlli. Per altre informazioni sulla Windows Forms Designer in Visual C#, vedere Creazione di un progetto (Visual C#).

  6. Incollare il codice seguente nell'evento ColumnClick per il controllo ListView:

    // Determine if clicked column is already the column that is being sorted.
    if (e.Column == lvwColumnSorter.SortColumn)
    {
        // Reverse the current sort direction for this column.
        if (lvwColumnSorter.Order == SortOrder.Ascending)
        {
            lvwColumnSorter.Order = SortOrder.Descending;
        }
        else
        {
            lvwColumnSorter.Order = SortOrder.Ascending;
        }
    }
    else
    {
        // Set the column number that is to be sorted; default to ascending.
        lvwColumnSorter.SortColumn = e.Column;
        lvwColumnSorter.Order = SortOrder.Ascending;
    }
    
    // Perform the sort with these new sort options.
    this.listView1.Sort();
    
  7. Scegliere Aggiungi classe dal menu Progetto per aggiungere una nuova classe al progetto.

  8. Sostituire tutto il codice predefinito nella nuova classe con il codice seguente:

    using System.Collections;
    using System.Windows.Forms;
    
    /// <summary>
    /// This class is an implementation of the 'IComparer' interface.
    /// </summary>
    public class ListViewColumnSorter : IComparer
    {
        /// <summary>
        /// Specifies the column to be sorted
        /// </summary>
        private int ColumnToSort;
    
        /// <summary>
        /// Specifies the order in which to sort (i.e. 'Ascending').
        /// </summary>
        private SortOrder OrderOfSort;
    
        /// <summary>
        /// Case insensitive comparer object
        /// </summary>
        private CaseInsensitiveComparer ObjectCompare;
    
        /// <summary>
        /// Class constructor. Initializes various elements
        /// </summary>
        public ListViewColumnSorter()
        {
            // Initialize the column to '0'
            ColumnToSort = 0;
    
            // Initialize the sort order to 'none'
            OrderOfSort = SortOrder.None;
    
            // Initialize the CaseInsensitiveComparer object
            ObjectCompare = new CaseInsensitiveComparer();
        }
    
        /// <summary>
        /// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison.
        /// </summary>
        /// <param name="x">First object to be compared</param>
        /// <param name="y">Second object to be compared</param>
        /// <returns>The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y'</returns>
        public int Compare(object x, object y)
        {
            int compareResult;
            ListViewItem listviewX, listviewY;
    
            // Cast the objects to be compared to ListViewItem objects
            listviewX = (ListViewItem)x;
            listviewY = (ListViewItem)y;
    
            // Compare the two items
            compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text,listviewY.SubItems[ColumnToSort].Text);
    
            // Calculate correct return value based on object comparison
            if (OrderOfSort == SortOrder.Ascending)
            {
                // Ascending sort is selected, return normal result of compare operation
                return compareResult;
            }
            else if (OrderOfSort == SortOrder.Descending)
            {
                // Descending sort is selected, return negative result of compare operation
                return (-compareResult);
            }
            else
            {
                // Return '0' to indicate they are equal
                return 0;
            }
        }
    
        /// <summary>
        /// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0').
        /// </summary>
        public int SortColumn
        {
            set
            {
                ColumnToSort = value;
            }
            get
            {
                return ColumnToSort;
            }
        }
    
        /// <summary>
        /// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending').
        /// </summary>
        public SortOrder Order
        {
            set
            {
                OrderOfSort = value;
            }
            get
            {
                return OrderOfSort;
            }
        }
    
    }
    
  9. Salvare, compilare ed eseguire il progetto di esempio.

  10. Fare clic sulle varie intestazioni di colonna nel controllo ListView. Quando si fa clic sull'intestazione, il contenuto del controllo ListView viene ordinato in ordine crescente in base alla colonna su cui si fa clic. Quando si fa di nuovo clic sulla stessa intestazione di colonna, tale colonna viene ordinata in ordine decrescente.