Utiliser Visual C# pour trier un contrôle ListView à l’aide d’une colonne

Cet article fournit des informations sur la façon de trier un contrôle ListView à l’aide d’une colonne dans Visual C# et fournit également un exemple de code pour expliquer les méthodes.

Version d’origine du produit : Visual C#
Numéro de la base de connaissances d’origine : 319401

Résumé

Lorsque vous utilisez le contrôle ListView, vous pouvez trier son contenu en fonction d’une colonne spécifique. Un exemple de ce type de fonctionnalité se produit dans un programme Windows Explorer lorsque vous affichez le contenu d’un dossier sur votre disque dur. En mode Détails, Windows Explorer affiche des informations sur les fichiers de ce dossier. Par exemple, vous voyez le nom du fichier, la taille du fichier, le type de fichier et la date à laquelle le fichier a été modifié. Lorsque vous cliquez sur l’un des en-têtes de colonne, la liste est triée dans l’ordre croissant en fonction de cette colonne. Lorsque vous cliquez à nouveau sur le même en-tête de colonne, la colonne est triée dans l’ordre décroissant.

L’exemple de cet article définit une classe qui hérite de l’interface IComparer . En outre, cet exemple utilise la Compare méthode de la CaseInsenstiveComparer classe pour effectuer la comparaison réelle des éléments.

Remarque

  • Cette méthode de comparaison ne respecte pas la casse.
  • Toutes les colonnes de cet exemple sont triées de manière textuelle .

Si vous souhaitez trier d’une manière différente (par exemple, numériquement), vous pouvez remplacer la ligne de code suivante par l’approche de tri que vous souhaitez utiliser :

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

Étapes de génération de l’exemple de projet

  1. Créez un projet d’application Windows Visual C#. Form1 est créé par défaut.

  2. Ajoutez un contrôle ListView à Form1. Dimensionner la forme de plusieurs pouces de large par plusieurs pouces de haut.

  3. Collez le code suivant dans la classe pour le formulaire :

    private ListViewColumnSorter lvwColumnSorter;
    
  4. Collez le code suivant dans le constructeur du formulaire, après l’appel à la InitializeComponent méthode :

    // Create an instance of a ListView column sorter and assign it
    // to the ListView control.
    lvwColumnSorter = new ListViewColumnSorter();
    this.listView1.ListViewItemSorter = lvwColumnSorter;
    
  5. Collez le code suivant dans l’événement Load du formulaire :

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

    Remarque

    Le code doit être modifié dans Visual Studio. Lorsque vous créez un projet Windows Forms, Visual C# ajoute un formulaire au projet par défaut. Ce formulaire est nommé Form1. Les deux fichiers qui représentent le formulaire sont nommés Form1.cs et Form1.designer.cs. Vous écrivez votre code dans Form1.cs. Le fichier Designer.cs est l’endroit où le Windows Forms Designer écrit le code qui implémente toutes les actions que vous avez effectuées en ajoutant des contrôles. Pour plus d’informations sur la Windows Forms Designer dans Visual C#, consultez Création d’un projet (Visual C#).

  6. Collez le code suivant dans l’événement ColumnClick pour le contrôle 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. Dans le menu Projet , cliquez sur Ajouter une classe pour ajouter une nouvelle classe au projet.

  8. Remplacez tout le code par défaut dans la nouvelle classe par le code suivant :

    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. Enregistrez, générez, puis exécutez l’exemple de projet.

  10. Cliquez sur les différents en-têtes de colonne dans le contrôle ListView. Lorsque vous cliquez sur l’en-tête, le contenu du contrôle ListView est trié dans l’ordre croissant en fonction de la colonne sur laquelle vous cliquez. Lorsque vous cliquez à nouveau sur le même en-tête de colonne, cette colonne est triée dans l’ordre décroissant.