using System;
using System.Collections;
using System.Windows.Forms;
namespace CoDesign.Cad.ResourceDialog
{
///
/// 对ListView点击列标题自动排序功能
///
public class ListViewHelper
{
///
/// 构造函数
///
public ListViewHelper()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void ListView_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
System.Windows.Forms.ListView lv = sender as System.Windows.Forms.ListView;
// 检查点击的列是不是现在的排序列.
if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
{
// 重新设置此列的排序方法.
if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == System.Windows.Forms.SortOrder.Ascending)
{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Descending;
}
else
{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
}
}
else
{
// 设置排序列,默认为正向排序
(lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
}
// 用新的排序方法对ListView排序
((System.Windows.Forms.ListView)sender).Sort();
}
}
///
/// 继承自IComparer
///
public class ListViewColumnSorter : System.Collections.IComparer
{
///
/// 指定按照哪个列排序
///
private int ColumnToSort;
///
/// 指定排序的方式
///
private System.Windows.Forms.SortOrder OrderOfSort;
///
/// 声明CaseInsensitiveComparer类对象
///
private System.Collections.CaseInsensitiveComparer ObjectCompare;
///
/// 构造函数
///
public ListViewColumnSorter(int colNum=0)
{
// 默认按第一列排序
ColumnToSort = colNum;
// 排序方式为不排序
OrderOfSort = System.Windows.Forms.SortOrder.Ascending;
// 初始化CaseInsensitiveComparer类对象
ObjectCompare = new System.Collections.CaseInsensitiveComparer();
}
///
/// 重写IComparer接口.
///
/// 要比较的第一个对象
/// 要比较的第二个对象
/// 比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1
public int Compare(object x, object y)
{
int compareResult;
System.Windows.Forms.ListViewItem listviewX, listviewY;
// 将比较对象转换为ListViewItem对象
listviewX = (System.Windows.Forms.ListViewItem)x;
listviewY = (System.Windows.Forms.ListViewItem)y;
if (listviewXnull || listviewYnull)
{
return 0;
}
string xText = null;
if (ColumnToSort < listviewX.SubItems.Count)
{
xText = listviewX.SubItems[ColumnToSort].Text;
}
string yText = null;
if (ColumnToSort < listviewY.SubItems.Count)
{
yText = listviewY.SubItems[ColumnToSort].Text;
}
if (xText == null || yText == null)
{
return 0;
}
int xInt, yInt;
// 比较,如果值为日期,根据日期比较方式进行比较
if (IsDate(xText) && IsDate(yText))
{
compareResult = CompareDate(xText, yText);
}
else if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字
{
//比较数字
compareResult = CompareInt(xInt, yInt);
}
else
{
//比较对象
compareResult = ObjectCompare.Compare(xText, yText);
}
// 根据上面的比较结果返回正确的比较结果
if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
{
// 因为是正序排序,所以直接返回结果
return compareResult;
}
else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
{
// 如果是反序排序,所以要取负值再返回
return (-compareResult);
}
else
{
// 如果相等返回0
return 0;
}
}
///
/// 判断是否为正确的IP地址,IP范围(0.0.0.0~255.255.255)
///
/// 需验证的IP地址
///
public bool IsIP(String ip)
{
return System.Text.RegularExpressions.Regex.Match(ip, @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0).(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$").Success;
}
///
/// 比较两个数字的大小
///
/// 要比较的第一个对象
/// 要比较的第二个对象
/// 比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1
private int CompareInt(int x, int y)
{
if (x > y)
{
return 1;
}
else if (x < y)
{
return -1;
}
else
{
return 0;
}
}
///
/// 比较两个IP地址的大小
///
/// 要比较的第一个对象
/// 要比较的第二个对象
/// 比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1
private int CompareIp(string ipx, string ipy)
{
string[] ipxs = ipx.Split(’.’);
string[] ipys = ipy.Split(’.’);
for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(ipxs[i]) > Convert.ToInt32(ipys[i]))
{
return 1;
}
else if (Convert.ToInt32(ipxs[i]) < Convert.ToInt32(ipys[i]))
{
return -1;
}
else
{
continue;
}
}
return 0;
}
///
/// 判断字符串是否是日期
///
///
///
public bool IsDate(string strDate)
{
try
{
DateTime.Parse(strDate);
return true;
}
catch
{
return false;
}
}
///
/// 比较两个日期字符串大小
///
///
///
///
public int CompareDate(string dateStr1, string dateStr2)
{
//将日期字符串转换为日期对象
DateTime t1 = Convert.ToDateTime(dateStr1);
DateTime t2 = Convert.ToDateTime(dateStr2);
//通过DateTIme.Compare()进行比较()
int compNum = DateTime.Compare(t1, t2);
return compNum;
}
///
/// 获取或设置按照哪一列排序.
///
public int SortColumn
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}
///
/// 获取或设置排序方式.
///
public System.Windows.Forms.SortOrder Order
{
set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
}
}
调用方式:
this.ListView1.ListViewItemSorter = new ListViewColumnSorter(8);//默认按第八列排序
this.ListView1.ColumnClick += new ColumnClickEventHandler(ListViewHelper.ListView_ColumnClick);