点击listview 的列头对其item进行自动排序

若要自定义排序顺序,必须编写一个实现 IComparer 接口的类,并将 ListViewItemSorter 属性设置为该类的一个对象。
当设置 ListViewItemSorter 属性值时,将自动调用 Sort 方法。

 

实现 IComparer 接口的类:

//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
using System.Collections;
using System.Windows.Forms;

namespace APIdesktop54
{
    public class ListViewColumnSorter:IComparer
    {
        private int sortColumn; //指定按照哪个列排序
        private SortOrder order; //指定排序的方式


        public int SortColumn
        {
            get
            {
                return sortColumn;
            }

            set
            {
                sortColumn = value;
            }
        }

        public SortOrder Order
        {
            get 

            {
                return order;
            }
            set
            {
                order = value;
            }
        }


        private CaseInsensitiveComparer ObjectCompare; //声明 CaseInsensitiveComparer 类对象
        /// 
        /// 构造函数
        /// 
        public ListViewColumnSorter()
        {
            sortColumn = 0;    //默认按第一列排序
            order = SortOrder.None; //排序方式为不排序
            ObjectCompare = new CaseInsensitiveComparer(); //初始化 CaseInsensitiveComparer 类对象
         }

        public int Compare(object x,object y)
        {
            int compareResult;
            ListViewItem listviewX, listviewY;
           
            //将比较对象转换为ListViewItem对象
            listviewX=(ListViewItem)x;
            listviewY=(ListViewItem)y;

            //比较
            compareResult = ObjectCompare.Compare(listviewX.SubItems[sortColumn].Text,listviewY.SubItems[sortColumn].Text);

            //根据上面的比较结果,返回正确的比较结果
            if(order==SortOrder.Ascending)
            {
                return compareResult;
            }
            else if (order == SortOrder.Descending)
            {
                return (-compareResult);
            }
            else
            {
                return 0;
            }
        }

        

    }
}
View Code

在form1中和listview的ColumnClick事件中实现下面的代码。

 public partial class Form1 : Form
    {
        private ListViewColumnSorter lvwColumnSorter;

        public Form1()
        {
            InitializeComponent();

            //若要自定义排序顺序,必须编写一个实现 IComparer 接口的类,并将 ListViewItemSorter 属性设置为该类的一个对象。
            //当设置 ListViewItemSorter 属性值时,将自动调用 Sort 方法。

            lvwColumnSorter = new ListViewColumnSorter();   //new一个listview的排序类的对象
            this.listView1.ListViewItemSorter = lvwColumnSorter;  //设置ListView1的排序列


            this.listView1.View = View.Details;

            this.listView1.Columns.Add(new ColumnHeader());
            this.listView1.Columns[0].Text = "Name";
            this.listView1.Columns[0].Width=100;

            this.listView1.Columns.Add(new ColumnHeader());
            this.listView1.Columns[1].Text = "Path";
            this.listView1.Columns[1].Width = 270;

            this.listView1.Columns.Add(new ColumnHeader());
            this.listView1.Columns[2].Text = "Type";
            this.listView1.Columns[2].Width = 50;


        }


        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {

            if (e.Column == lvwColumnSorter.SortColumn)   //检查点击的列是不是现在的排序列
            {
                //重新设置此列的排序方法
                if (lvwColumnSorter.Order == SortOrder.Ascending)
                {
                    lvwColumnSorter.Order = SortOrder.Descending;
                }
                else
                {
                    lvwColumnSorter.Order =SortOrder.Ascending;
                }

            }
            else
            {
                //设置排序列,默认为正向排序
                lvwColumnSorter.SortColumn = e.Column;
                lvwColumnSorter.Order = SortOrder.Ascending;

            }

            this.listView1.Sort();

        }

}
View Code

 

转载于:https://www.cnblogs.com/bloomalone/p/3437914.html

你可能感兴趣的:(点击listview 的列头对其item进行自动排序)