c#实现ListView的排序-飞外

【问题描述】:

当点击列标题的时候,能够完成对该列排序,同时显示排序的箭头,再次点击,按照反序排序。

【解决方法】:

1、创建一个类:ListViewColumnSorter继承IComparer接口

代码如下:

usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespaceCustomerManager/// summary ///对ListView的列进行比较排序/// /summary publicclassListViewColumnSorter:IComparer{privateintColumnToSort;//指定按照哪列排序privateSortOrderOrderOfSort;//指定排序的方式privateCaseInsensitiveComparerObjectCompare;//声明CaaseInsensitiveComparer类对象publicListViewColumnSorter()//构造函数{ColumnToSort=0;//默认按第一列排序OrderOfSort=SortOrder.None;//排序ObjectCompare=newCaseInsensitiveComparer();//初始化CaseInsensitiveComparer类对象}//重写IComparer接口//返回比较的结果:如果x=y返回0;如果x y返回1;如果x y返回-1publicintCompare(objectx,objecty){intcompareResult;ListViewItemlistViewX,listViewY;//将比较对象转换为ListViewItem对象listViewX=(ListViewItem)x;listViewY=(ListViewItem)y;//比较compareResult=ObjectCompare.Compare(listViewX.SubItems[ColumnToSort].Text,listViewY.SubItems[ColumnToSort].Text);//返回比较的结果if(OrderOfSort==SortOrder.Ascending){//因为是正序排序,所以直接返回结果returncompareResult;}elseif(OrderOfSort==SortOrder.Descending){//如果是反序排序,所以要取负值再返回return(-compareResult);}else{return0;}}///获取并设置按照哪一列排序.publicintSortColumn{set{ColumnToSort=value;}get{returnColumnToSort;}}///获取并设置排序方式.publicSortOrderOrder{set{OrderOfSort=value;}get{returnOrderOfSort;}}}}
2、主窗体中调用
namespaceCustomerManager{
publicpartialclassMainForm:Form{privateListViewColumnSorterlvwColumnSorter;publicMainForm(){InitializeComponent();
lvwColumnSorter=newListViewColumnSorter();}
 //排序privatevoidlvwCustomer_ColumnClick(objectsender,ColumnClickEventArgse){this.lvwCustomer.Columns[lvwColumnSorter.SortColumn].ImageIndex=2;if(lvwCustomer.Items.Count 0){//设置listView1的排序器this.lvwCustomer.ListViewItemSorter=lvwColumnSorter;lvwCustomer.Columns[e.Column].ImageIndex=1;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;}//用新的排序方法对ListView排序this.lvwCustomer.Sort();}}

【注意】:以上实现的对ListView中数据进行列排序,但是没有显示排序箭头,实现显示排序的箭头通过图片替换实现的。
实现排序箭头显示的步骤:
向窗体中添加一个imageList控件,向控件的Images属性中添加箭头上、箭头下和一张透明的图片,然后将imageList1绑定到ListView控件的SmallImageList属性上,
然后设置Column的ImageIndex的值进行图片的替换!