【问题】:当点击列标题的时候,能够完成对该列排序,再次点击,按照该列反序排序。
【解决方法】:
使用IComparer接口。
例子:
1.using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Windows.Forms;
namespace sortListView
{
class ListViewColumnSorter: IComparer
{
private int ColumnToSort;// 指定按照哪个列排序
private SortOrder OrderOfSort;// 指定排序的方式
private CaseInsensitiveComparer ObjectCompare;// 声明CaseInsensitiveComparer类对象,
public ListViewColumnSorter()// 构造函数
{
ColumnToSort = 0;// 默认按第一列排序
OrderOfSort = SortOrder.None;// 排序方式为不排序
ObjectCompare = new CaseInsensitiveComparer();// 初始化CaseInsensitiveComparer类对象
}
// 重写IComparer接口.
//
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
{
// 如果相等返回0
return 0;
}
}
/// 获取或设置按照哪一列排序.
public int SortColumn
{ set
{ ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}
/// 获取或设置排序方式.
public SortOrder Order
{ set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
} }}
================================
namespace sortListView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 创建一个ListView排序类的对象,并设置listView1的排序器
lvwColumnSorter = new ListViewColumnSorter();
this.listView1.ListViewItemSorter = lvwColumnSorter;
}
private void Form1_Load(object sender, EventArgs e)
{ 初始化listview1.
}
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;
}
// 用新的排序方法对ListView排序
this.listView1.Sort();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 obj = new Form2();
obj.Show();
} }}