Aracılığıyla paylaş


ListView denetimini sütun kullanarak sıralamak için Visual C# kullanma

Bu makale, Visual C# içinde bir sütun kullanarak ListView denetimini sıralama hakkında bilgi sağlar ve ayrıca yöntemleri açıklamak için bir kod örneği sağlar.

Özgün ürün sürümü: Visual C#
Özgün KB numarası: 319401

Özet

ListView denetimiyle çalışırken, içeriğini belirli bir sütuna göre sıralamak isteyebilirsiniz. Sabit diskinizde bir klasörün içeriğini görüntülediğinizde Windows Gezgini programında bu tür bir işlev örneği oluşur. Ayrıntılar görünümünde, Windows Gezgini bu klasördeki dosyalar hakkındaki bilgileri görüntüler. Örneğin, dosya adını, dosya boyutunu, dosya türünü ve dosyanın değiştirilme tarihini görürsünüz. Sütun üst bilgilerinden birine tıkladığınızda, liste bu sütuna göre artan düzende sıralanır. Aynı sütun üst bilgisine yeniden tıkladığınızda, sütun azalan düzende sıralanır.

Bu makaledeki örnek, arabirimden IComparer devralan bir sınıfı tanımlar. Ayrıca, bu örnek öğelerin gerçek karşılaştırmasını gerçekleştirmek için sınıfının yöntemini CaseInsenstiveComparer kullanırCompare.

Not

  • Bu karşılaştırma yöntemi büyük/küçük harfe duyarlı değildir.
  • Bu örnekteki tüm sütunlar metin biçiminde sıralanır.

Farklı bir şekilde (sayısal gibi) sıralamak istiyorsanız, aşağıdaki kod satırını kullanmak istediğiniz sıralama yaklaşımıyla değiştirebilirsiniz:

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

Örnek projeyi derleme adımları

  1. Yeni bir Visual C# Windows uygulama projesi oluşturun. Form1 varsayılan olarak oluşturulur.

  2. Form1'e ListView denetimi ekleyin. Formu birkaç inç genişliğinde ve birkaç inç uzunluğunda olacak şekilde boyutlandırın.

  3. Aşağıdaki kodu formun sınıfına yapıştırın:

    private ListViewColumnSorter lvwColumnSorter;
    
  4. Yöntemine yapılan çağrıdan sonra aşağıdaki kodu formun oluşturucusuna yapıştırın InitializeComponent :

    // Create an instance of a ListView column sorter and assign it
    // to the ListView control.
    lvwColumnSorter = new ListViewColumnSorter();
    this.listView1.ListViewItemSorter = lvwColumnSorter;
    
  5. Formun olayına Load aşağıdaki kodu yapıştırın:

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

    Not

    Kod Visual Studio'da değiştirilmelidir. Bir Windows Forms projesi oluşturduğunuzda, Visual C# varsayılan olarak projeye bir form ekler. Bu formun adı Form1'dir. Formu temsil eden iki dosya Form1.cs ve Form1.designer.cs olarak adlandırılır. Kodunuzu Form1.cs yazarsınız. Designer.cs dosyası, Windows Forms Designer'ın denetim ekleyerek gerçekleştirdiğiniz tüm eylemleri uygulayan kodu yazdığı yerdir. Visual C# içindeki Windows Forms Tasarımcısı hakkında daha fazla bilgi için Proje Oluşturma (Visual C#) adresini ziyaret edin.

  6. ListView denetimi için olaya aşağıdaki kodu ColumnClick yapıştırın:

    // 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. Projeye yeni bir sınıf eklemek için Proje menüsünde Sınıf Ekle'ye tıklayın.

  8. Yeni sınıftaki tüm varsayılan kodu aşağıdaki kodla değiştirin:

    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. Örnek projeyi kaydedin, derleyin ve çalıştırın.

  10. ListView denetimindeki çeşitli sütun üst bilgilerine tıklayın. Üst bilgiye tıkladığınızda, ListView denetiminin içeriği tıkladığınız sütuna göre artan düzende sıralanır. Aynı sütun üst bilgisine yeniden tıkladığınızda, bu sütun azalan düzende sıralanır.