【问题描述】:
当点击列标题的时候,能够完成对该列排序,同时显示排序的箭头,再次点击,按照反序排序。
【解决方法】:
1、创建一个类:ListViewColumnSorter继承IComparer接口
代码如下:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace CustomerManager { /// <summary> /// 对ListView的列进行比较排序 /// </summary> public class ListViewColumnSorter : IComparer { private int ColumnToSort; //指定按照哪列排序 private SortOrder OrderOfSort; //指定排序的方式 private CaseInsensitiveComparer ObjectCompare; //声明CaaseInsensitiveComparer类对象 public ListViewColumnSorter() //构造函数 { ColumnToSort = 0; //默认按第一列排序 OrderOfSort = SortOrder.None; //排序 ObjectCompare = new CaseInsensitiveComparer(); //初始化CaseInsensitiveComparer类对象 } //重写IComparer接口 //返回比较的结果:如果x=y返回0;如果x>y返回1;如果x<y返回-1 public int Compare(object x, object y) { int compareResult; ListViewItem listViewX, listViewY; //将比较对象转换为ListViewItem对象 listViewX = (ListViewItem)x; listViewY = (ListViewItem)y; //比较 compareResult = ObjectCompare.Compare(listViewX.SubItems[ColumnToSort].Text, listViewY.SubItems[ColumnToSort].Text); // 返回比较的结果 if (OrderOfSort == SortOrder.Ascending) { // 因为是正序排序,所以直接返回结果 return compareResult; } else if (OrderOfSort == SortOrder.Descending) { // 如果是反序排序,所以要取负值再返回 return (-compareResult); } else { return 0; } } /// 获取并设置按照哪一列排序. public int SortColumn { set { ColumnToSort = value; } get { return ColumnToSort; } } /// 获取并设置排序方式. public SortOrder Order { set { OrderOfSort = value; } get { return OrderOfSort; } } } }
2、主窗体中调用
namespace CustomerManager {
public partial class MainForm : Form { private ListViewColumnSorter lvwColumnSorter; public MainForm() { InitializeComponent();
lvwColumnSorter = new ListViewColumnSorter(); }
//排序 private void lvwCustomer_ColumnClick(object sender, ColumnClickEventArgs e) { 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的值进行图片的替换!