点击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 类对象

        /// <summary>

        /// 构造函数

        /// </summary>

        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

 

你可能感兴趣的:(ListView)