Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit des informations sur le tri d’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 du produit d’origine : Visual C#
Numéro de 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 De l’Explorateur Windows lorsque vous affichez le contenu d’un dossier sur votre disque dur. En mode Détails, l’Explorateur Windows 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 par 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.
Note
- Cette méthode de comparaison n’est pas sensible à la casse.
- Toutes les colonnes de cet exemple sont triées de manière textuelle .
Si vous souhaitez trier de manière différente (par exemple numériquement), vous pouvez remplacer la ligne de code suivante par l’approche du 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
Créez un projet d’application Windows Visual C#. Form1 est créé par défaut.
Ajoutez un contrôle ListView à Form1. Dimensionner la forme de plusieurs pouces de large par plusieurs pouces de hauteur.
Collez le code suivant dans la classe du formulaire :
private ListViewColumnSorter lvwColumnSorter;Collez le code suivant dans le constructeur du formulaire, après l’appel à la
InitializeComponentméthode :// Create an instance of a ListView column sorter and assign it // to the ListView control. lvwColumnSorter = new ListViewColumnSorter(); this.listView1.ListViewItemSorter = lvwColumnSorter;Collez le code suivant dans l’événement
Loaddu 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; }Note
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’emplacement où le Concepteur Windows Forms écrit le code qui implémente toutes les actions que vous avez effectuées en ajoutant des contrôles. Pour plus d’informations sur le Concepteur Windows Forms en Visual C#, consultez Création d’un projet (Visual C#).
Collez le code suivant dans l’événement
ColumnClickpour 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();Dans le menu Projet , cliquez sur Ajouter une classe pour ajouter une nouvelle classe au projet.
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; } } }Enregistrez, générez, puis exécutez l’exemple de projet.
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é par ordre croissant en fonction de la colonne que 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.