ListView排序并隔色显示
2014-03-18 21:57
363 查看
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 { // 如果相等返回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; } } } }
下面是应用排序,并不同值隔色显示
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(); }
相关文章推荐
- fzu 2038图的遍历,递归求解
- 使用 Mono Develop 调试 U3D 脚本
- struts2多文件上传(修改名称、压缩图片、删除图片)
- 学习OpenCV范例(十三)——图像金字塔
- ContentProvider,SQLiteOpenHelper,SQLiteDatabase三者之间的区别和联系
- MVC 在控制器中获取某个视图动态的HTML代码
- 编程回忆之Android回忆(AnimationDrawable的使用)
- matlab 调试
- 说话内容做得好无非有几点,信息量大、逻辑严密、表达趣味。还有,学会闭嘴。文自/宗宁
- USACO Section 1.5 Superprime Rib
- 动态规划小结
- Eclipse安装ADT失败解决办法
- iframe去边框,无边框,使用大全
- HighCharts之2D折线图
- python学习笔记
- USACO Section 1.5 Prime Palindromes
- HighCharts之2D折线图
- Struts2—整合Spring
- struts 标签1
- 浙大PAT 3-06. 表达式转换 (解题思路)