Verwenden von Visual C# zum Sortieren eines ListView-Steuerelements mithilfe einer Spalte

Dieser Artikel enthält Informationen zum Sortieren eines ListView-Steuerelements mithilfe einer Spalte in Visual C# sowie ein Codebeispiel zur Erläuterung der Methoden.

Ursprüngliche Produktversion: Visual C#
Ursprüngliche KB-Nummer: 319401

Zusammenfassung

Wenn Sie mit dem ListView-Steuerelement arbeiten, können Sie dessen Inhalt basierend auf einer bestimmten Spalte sortieren. Ein Beispiel für diese Art von Funktionalität tritt in einem Windows Explorer-Programm auf, wenn Sie den Inhalt eines Ordners auf Ihrer Festplatte anzeigen. In der Detailansicht zeigt Windows Explorer Informationen zu den Dateien in diesem Ordner an. Sie sehen beispielsweise den Dateinamen, die Dateigröße, den Dateityp und das Datum, an dem die Datei geändert wurde. Wenn Sie auf eine der Spaltenüberschriften klicken, wird die Liste basierend auf dieser Spalte in aufsteigender Reihenfolge sortiert. Wenn Sie erneut auf die gleiche Spaltenüberschrift klicken, wird die Spalte in absteigender Reihenfolge sortiert.

Im Beispiel in diesem Artikel wird eine Klasse definiert, die von der IComparer -Schnittstelle erbt. Darüber hinaus wird in diesem Beispiel die Compare -Methode der CaseInsenstiveComparer -Klasse verwendet, um den tatsächlichen Vergleich der Elemente durchzuführen.

Hinweis

  • Bei dieser Vergleichsmethode wird die Groß-/Kleinschreibung nicht beachtet.
  • Alle Spalten in diesem Beispiel werden textweise sortiert.

Wenn Sie eine andere Sortierung (z. B. numerisch) ausführen möchten, können Sie die folgende Codezeile durch den gewünschten Sortieransatz ersetzen:

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

Schritte zum Erstellen des Beispielprojekts

  1. Erstellen Sie ein neues Visual C#-Windows-Anwendungsprojekt. Form1 wird standardmäßig erstellt.

  2. Fügen Sie form1 ein ListView-Steuerelement hinzu. Größe des Formulars so, dass es mehrere Zoll breit und mehrere Zoll hoch ist.

  3. Fügen Sie den folgenden Code in die -Klasse für das Formular ein:

    private ListViewColumnSorter lvwColumnSorter;
    
  4. Fügen Sie nach dem Aufruf der -Methode den folgenden Code in den Konstruktor für das InitializeComponent Formular ein:

    // Create an instance of a ListView column sorter and assign it
    // to the ListView control.
    lvwColumnSorter = new ListViewColumnSorter();
    this.listView1.ListViewItemSorter = lvwColumnSorter;
    
  5. Fügen Sie den folgenden Code in das Load -Ereignis für das Formular ein:

    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;
    }
    

    Hinweis

    Der Code sollte in Visual Studio geändert werden. Wenn Sie ein Windows Forms-Projekt erstellen, fügt Visual C# dem Projekt standardmäßig ein Formular hinzu. Dieses Formular heißt Form1. Die beiden Dateien, die das Formular darstellen, heißen Form1.cs und Form1.designer.cs. Sie schreiben Ihren Code in Form1.cs. In der Designer.cs-Datei schreibt der Windows Forms Designer den Code, der alle Aktionen implementiert, die Sie durch Hinzufügen von Steuerelementen ausgeführt haben. Weitere Informationen zum Windows Forms Designer in Visual C# finden Sie unter Erstellen eines Projekts (Visual C#).

  6. Fügen Sie den folgenden Code in das ColumnClick -Ereignis für das ListView-Steuerelement ein:

    // 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. Klicken Sie im Menü Projekt auf Klasse hinzufügen , um dem Projekt eine neue Klasse hinzuzufügen.

  8. Ersetzen Sie den gesamten Standardcode in der neuen Klasse durch den folgenden Code:

    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. Speichern Sie das Beispielprojekt, erstellen Sie es, und führen Sie es dann aus.

  10. Klicken Sie im ListView-Steuerelement auf die verschiedenen Spaltenüberschriften. Wenn Sie auf die Kopfzeile klicken, wird der Inhalt des ListView-Steuerelements basierend auf der Spalte, auf die Sie klicken, in aufsteigender Reihenfolge sortiert. Wenn Sie erneut auf dieselbe Spaltenüberschrift klicken, wird diese Spalte in absteigender Reihenfolge sortiert.