在C#中实现对ListView点击列标题自动排序功能

  1. 首先定义一个ListViewHelper类,代码如下:
  2. using System;
  3. using System.Collections;
  4. using System.Data;
  5. using System.Windows.Forms;
  6. using System.Drawing;
  7. namespace Common
  8. ...{
  9.     /**//// <summary>
  10.     /// 模块编号:
  11.     /// 模块功能:对ListView的封装
  12.     /// 作      者:雷友兵
  13.     /// 编写时间:2007-1-10
  14.     /// </summary>
  15.     public class ListViewHelper
  16.     ...{
  17.         /**//// <summary>
  18.         /// 构造函数
  19.         /// </summary>
  20.         public ListViewHelper()
  21.         ...{
  22.             //
  23.             // TODO: 在此处添加构造函数逻辑
  24.             //
  25.         }
  26.         public static void ListView_ColumnClick(object sender, ColumnClickEventArgs e)
  27.         ...{
  28.             ListView lv = sender as ListView;
  29.             // 检查点击的列是不是现在的排序列.
  30.             if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
  31.             ...{
  32.                 // 重新设置此列的排序方法.
  33.                 if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == SortOrder.Ascending)
  34.                 ...{
  35.                     (lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Descending;
  36.                 }
  37.                 else
  38.                 ...{
  39.                     (lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;
  40.                 }
  41.             }
  42.             else
  43.             ...{
  44.                 // 设置排序列,默认为正向排序
  45.                 (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
  46.                 (lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;
  47.             }
  48.             // 用新的排序方法对ListView排序
  49.             ((ListView)sender).Sort();
  50.         }
  51.     }
  52.     /**//// <summary>
  53.     /// 继承自IComparer
  54.     /// </summary>
  55.     public class ListViewColumnSorter : IComparer
  56.     ...{
  57.         /**//// <summary>
  58.         /// 指定按照哪个列排序
  59.         /// </summary>
  60.         private int ColumnToSort;
  61.         /**//// <summary>
  62.         /// 指定排序的方式
  63.         /// </summary>
  64.         private SortOrder OrderOfSort;
  65.         /**//// <summary>
  66.         /// 声明CaseInsensitiveComparer类对象,
  67.         /// 参见ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemCollectionsCaseInsensitiveComparerClassTopic.htm
  68.         /// </summary>
  69.         private CaseInsensitiveComparer ObjectCompare;
  70.         /**//// <summary>
  71.         /// 构造函数
  72.         /// </summary>
  73.         public ListViewColumnSorter()
  74.         ...{
  75.             // 默认按第一列排序
  76.             ColumnToSort = 0;
  77.             // 排序方式为不排序
  78.             OrderOfSort = SortOrder.None;
  79.             // 初始化CaseInsensitiveComparer类对象
  80.             ObjectCompare = new CaseInsensitiveComparer();
  81.         }
  82.         /**//// <summary>
  83.         /// 重写IComparer接口.
  84.         /// </summary>
  85.         /// <param name="x">要比较的第一个对象</param>
  86.         /// <param name="y">要比较的第二个对象</param>
  87.         /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
  88.         public int Compare(object x, object y)
  89.         ...{
  90.             int compareResult;
  91.             ListViewItem listviewX, listviewY;
  92.             // 将比较对象转换为ListViewItem对象
  93.             listviewX = (ListViewItem)x;
  94.             listviewY = (ListViewItem)y;
  95.             // 比较
  96.             compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text);
  97.             // 根据上面的比较结果返回正确的比较结果
  98.             if (OrderOfSort == SortOrder.Ascending)
  99.             ...{
  100.                 // 因为是正序排序,所以直接返回结果
  101.                 return compareResult;
  102.             }
  103.             else if (OrderOfSort == SortOrder.Descending)
  104.             ...{
  105.                 // 如果是反序排序,所以要取负值再返回
  106.                 return (-compareResult);
  107.             }
  108.             else
  109.             ...{
  110.                 // 如果相等返回0
  111.                 return 0;
  112.             }
  113.         }
  114.         /**//// <summary>
  115.         /// 获取或设置按照哪一列排序.
  116.         /// </summary>
  117.         public int SortColumn
  118.         ...{
  119.             set
  120.             ...{
  121.                 ColumnToSort = value;
  122.             }
  123.             get
  124.             ...{
  125.                 return ColumnToSort;
  126.             }
  127.         }
  128.         /**//// <summary>
  129.         /// 获取或设置排序方式.
  130.         /// </summary>
  131.         public SortOrder Order
  132.         ...{
  133.             set
  134.             ...{
  135.                 OrderOfSort = value;
  136.             }
  137.             get
  138.             ...{
  139.                 return OrderOfSort;
  140.             }
  141.         }
  142.     }
  143. }

 

以上代码封装后无须更改,在窗体中添加一个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);
}


运行一下,看看ListView单击列标题时是不是已经实现自动排序了?

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值