[点晴永久免费OA]在C#中实现对ListView点击列标题自动排序功能
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
首先定义一个ListViewHelper类,代码如下:
using System;
using System.Collections;
using System.Data;
using System.Windows.Forms;
using System.Drawing;
namespace Common
...{
/**//// <summary>
/// 模块编号:
/// 模块功能:对ListView的封装
/// 作 者:雷友兵
/// 编写时间:2007-1-10
/// </summary>
public class ListViewHelper
...{
/**//// <summary>
/// 构造函数
/// </summary>
public ListViewHelper()
...{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void ListView_ColumnClick(object sender, ColumnClickEventArgs e)
...{
ListView lv = sender as ListView;
// 检查点击的列是不是现在的排序列.
if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
...{
// 重新设置此列的排序方法.
if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == SortOrder.Ascending)
...{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Descending;
}
else
...{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;
}
}
else
...{
// 设置排序列,默认为正向排序
(lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
(lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;
}
// 用新的排序方法对ListView排序
((ListView)sender).Sort();
}
}
/**//// <summary>
/// 继承自IComparer
/// </summary>
public class ListViewColumnSorter : IComparer
...{
/**//// <summary>
/// 指定按照哪个列排序
/// </summary>
private int ColumnToSort;
/**//// <summary>
/// 指定排序的方式
/// </summary>
private SortOrder OrderOfSort;
/**//// <summary>
/// 声明CaseInsensitiveComparer类对象,
/// 参见ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemCollectionsCaseInsensitiveComparerClassTopic.htm
/// </summary>
private CaseInsensitiveComparer ObjectCompare;
/**//// <summary>
/// 构造函数
/// </summary>
public ListViewColumnSorter()
...{
// 默认按第一列排序
ColumnToSort = 0;
// 排序方式为不排序
OrderOfSort = SortOrder.None;
// 初始化CaseInsensitiveComparer类对象
ObjectCompare = new CaseInsensitiveComparer();
}
/**//// <summary>
/// 重写IComparer接口.
/// </summary>
/// <param name="x">要比较的第一个对象</param>
/// <param name="y">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
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;
}
}
/**//// <summary>
/// 获取或设置按照哪一列排序.
/// </summary>
public int SortColumn
...{
set
...{
ColumnToSort = value;
}
get
...{
return ColumnToSort;
}
}
/**//// <summary>
/// 获取或设置排序方式.
/// </summary>
public SortOrder Order
...{
set
...{
OrderOfSort = value;
}
get
...{
return OrderOfSort;
}
}
}
} 以上代码封装后无须更改,在窗体中添加一个ListView控件,在窗体的Load事件中添加如下代码: private void Form1_Load( object sender, EventArgs e) { this .listView1.ListViewItemSorter = new Common.ListViewColumnSorter(); this .listView1.ColumnClick += new ColumnClickEventHandler(Common.ListViewHelper.ListView_ColumnClick); } 该文章在 2022/12/22 20:11:59 编辑过 |
关键字查询
相关文章
正在查询... |