【问题描述】:
当点击列标题的时候,能够完成对该列排序,同时显示排序的箭头,再次点击,按照反序排序。
【解决方法】:
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的值进行图片的替换!