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

时间:2023-03-09 23:35:35
点击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 = ; //默认按第一列排序
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 ;
}
} }
}

在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[].Text = "Name";
this.listView1.Columns[].Width=; this.listView1.Columns.Add(new ColumnHeader());
this.listView1.Columns[].Text = "Path";
this.listView1.Columns[].Width = ; this.listView1.Columns.Add(new ColumnHeader());
this.listView1.Columns[].Text = "Type";
this.listView1.Columns[].Width = ; } 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(); } }