Freigeben über


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# und enthält außerdem ein Codebeispiel zur Erläuterung der Methoden.

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

Zusammenfassung

Wenn Sie mit dem ListView-Steuerelement arbeiten, können Sie deren 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 der Festplatte anzeigen. In der Detailansicht zeigt Windows Explorer Informationen zu den Dateien in diesem Ordner an. Beispielsweise wird der Dateiname, die Dateigröße, der Dateityp und das Datum angezeigt, 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 dieselbe Spaltenüberschrift klicken, wird die Spalte in absteigender Reihenfolge sortiert.

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

Notiz

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

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

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

Schritte zum Erstellen des Beispielprojekts

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

  2. Hinzufügen eines ListView-Steuerelements zu Form1. Größe des Formulars, das mehrere Zoll breit um mehrere Zoll hoch sein soll.

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

    private ListViewColumnSorter lvwColumnSorter;
    
  4. Fügen Sie den folgenden Code nach dem Aufruf der InitializeComponent Methode in den Konstruktor für das 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;
    }
    

    Notiz

    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, werden Form1.cs und Form1.designer.cs benannt. Sie schreiben Ihren Code in Form1.cs. Die Designer.cs Datei ist der Ort, an dem der Windows Forms-Designer den Code schreibt, 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 Creating a Project (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, erstellen und führen Sie dann das Beispielprojekt aus.

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