using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; using System.Windows.Forms; using System.Drawing;namespace STools {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);//Console.WriteLine(listviewX.SubItems[ColumnToSort].Text + "<->" + listviewY.SubItems[ColumnToSort].Text+":"+compareResult);// 根据上面的比较结果返回正确的比较结果if (OrderOfSort == SortOrder.Ascending){// 因为是正序排序,所以直接返回结果return compareResult;}else if (OrderOfSort == SortOrder.Descending){// 如果是反序排序,所以要取负值再返回return (-compareResult);}else{// 如果相等返回0return 0;}} /**//// <summary>/// 获取或设置按照哪一列排序./// </summary>public int SortColumn{set{ColumnToSort = value;}get{return ColumnToSort;}} /**//// <summary>/// 获取或设置排序方式./// </summary>public SortOrder Order{set{OrderOfSort = value;}get{return OrderOfSort;}}} }
下面是应用排序,并不同值隔色显示
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e){ListView lv = sender as ListView;// 检查点击的列是不是现在的排序列. int column = (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn;//当前排序的序列listView1.Columns[column].Text = listView1.Columns[column].Text.Replace("↓", "").Replace("↑", "");if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn){// 重新设置此列的排序方法. if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == SortOrder.Ascending){(lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Descending;listView1.Columns[e.Column].Text += "↑";}else{(lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;listView1.Columns[e.Column].Text += "↓";}}else{// 设置排序列,默认为正向排序 (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;(lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;listView1.Columns[e.Column].Text += "↓";}// 用新的排序方法对ListView排序 ((ListView)sender).Sort();for (int i = 0; i < listView1.Items.Count; i++){if (i != 0 && listView1.Items[i].SubItems[e.Column].Text == listView1.Items[i - 1].SubItems[e.Column].Text){listView1.Items[i].BackColor = listView1.Items[i - 1].BackColor;}else if (i == 0){listView1.Items[i].BackColor = Color.Transparent;}else{if (listView1.Items[i - 1].BackColor == Color.Transparent){listView1.Items[i].BackColor = Color.LightBlue;}else{listView1.Items[i].BackColor = Color.Transparent;}}}//listView1.Refresh();}