• C# listview 单击列头实现排序 <二>


    单击列头实现排序,首先在羡慕中添加下面的帮助实现的类;具体的代码:

      1 using System;
      2 using System.Collections;
      3 using System.Windows.Forms;
      4 namespace Common
      5 {
      6     /// <summary>
      7     /// 对ListView点击列标题自动排序功能
      8     /// </summary>
      9     public class ListViewHelper
     10     {
     11         /// <summary>
     12         /// 构造函数
     13         /// </summary>
     14         public ListViewHelper()
     15         {
     16             //
     17             // TODO: 在此处添加构造函数逻辑
     18             //
     19         }
     20         public static void ListView_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
     21         {
     22             System.Windows.Forms.ListView lv = sender as System.Windows.Forms.ListView;
     23             // 检查点击的列是不是现在的排序列.
     24             if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
     25             {
     26                 // 重新设置此列的排序方法.
     27                 if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == System.Windows.Forms.SortOrder.Ascending)
     28                 {
     29                     (lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Descending;
     30                 }
     31                 else
     32                 {
     33                     (lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
     34                 }
     35             }
     36             else
     37             {
     38                 // 设置排序列,默认为正向排序
     39                 (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
     40                 (lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
     41             }
     42             // 用新的排序方法对ListView排序
     43             ((System.Windows.Forms.ListView)sender).Sort();
     44         }
     45     }
     46     /// <summary>
     47     /// 继承自IComparer
     48     /// </summary>
     49     public class ListViewColumnSorter : System.Collections.IComparer
     50     {
     51         /// <summary>
     52         /// 指定按照哪个列排序
     53         /// </summary>
     54         private int ColumnToSort;
     55         /// <summary>
     56         /// 指定排序的方式
     57         /// </summary>
     58         private System.Windows.Forms.SortOrder OrderOfSort;
     59         /// <summary>
     60         /// 声明CaseInsensitiveComparer类对象
     61         /// </summary>
     62         private System.Collections.CaseInsensitiveComparer ObjectCompare;
     63         /// <summary>
     64         /// 构造函数
     65         /// </summary>
     66         public ListViewColumnSorter()
     67         {
     68             // 默认按第一列排序
     69             ColumnToSort = 0;
     70             // 排序方式为不排序
     71             OrderOfSort = System.Windows.Forms.SortOrder.None;
     72             // 初始化CaseInsensitiveComparer类对象
     73             ObjectCompare = new System.Collections.CaseInsensitiveComparer();
     74         }
     75         /// <summary>
     76         /// 重写IComparer接口.
     77         /// </summary>
     78         /// <param name="x">要比较的第一个对象</param>
     79         /// <param name="y">要比较的第二个对象</param>
     80         /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
     81         public int Compare(object x, object y)
     82         {
     83             int compareResult;
     84             System.Windows.Forms.ListViewItem listviewX, listviewY;
     85             // 将比较对象转换为ListViewItem对象
     86             listviewX = (System.Windows.Forms.ListViewItem)x;
     87             listviewY = (System.Windows.Forms.ListViewItem)y;
     88             string xText = listviewX.SubItems[ColumnToSort].Text;
     89             string yText = listviewY.SubItems[ColumnToSort].Text;
     90             int xInt, yInt;
     91             // 比较,如果值为IP地址,则根据IP地址的规则排序。
     92             if (IsIP(xText) && IsIP(yText))
     93             {
     94                 compareResult = CompareIp(xText, yText);
     95             }
     96             else if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字
     97             {
     98                 //比较数字
     99                 compareResult = CompareInt(xInt, yInt);
    100             }
    101             else
    102             {
    103                 //比较对象
    104                 compareResult = ObjectCompare.Compare(xText, yText);
    105             }
    106             // 根据上面的比较结果返回正确的比较结果
    107             if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
    108             {
    109                 // 因为是正序排序,所以直接返回结果
    110                 return compareResult;
    111             }
    112             else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
    113             {
    114                 // 如果是反序排序,所以要取负值再返回
    115                 return (-compareResult);
    116             }
    117             else
    118             {
    119                 // 如果相等返回0
    120                 return 0;
    121             }
    122         }
    123         /// <summary>
    124         /// 判断是否为正确的IP地址,IP范围(0.0.0.0~255.255.255)
    125         /// </summary>
    126         /// <param name="ip">需验证的IP地址</param>
    127         /// <returns></returns>
    128         public bool IsIP(String ip)
    129         {
    130             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;
    131         }
    132         /// <summary>
    133         /// 比较两个数字的大小
    134         /// </summary>
    135         /// <param name="ipx">要比较的第一个对象</param>
    136         /// <param name="ipy">要比较的第二个对象</param>
    137         /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
    138         private int CompareInt(int x, int y)
    139         {
    140             if (x > y)
    141             {
    142                 return 1;
    143             }
    144             else if (x < y)
    145             {
    146                 return -1;
    147             }
    148             else
    149             {
    150                 return 0;
    151             }
    152         }
    153         /// <summary>
    154         /// 比较两个IP地址的大小
    155         /// </summary>
    156         /// <param name="ipx">要比较的第一个对象</param>
    157         /// <param name="ipy">要比较的第二个对象</param>
    158         /// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
    159         private int CompareIp(string ipx, string ipy)
    160         {
    161             string[] ipxs = ipx.Split('.');
    162             string[] ipys = ipy.Split('.');
    163             for (int i = 0; i < 4; i++)
    164             {
    165                 if (Convert.ToInt32(ipxs[i]) > Convert.ToInt32(ipys[i]))
    166                 {
    167                     return 1;
    168                 }
    169                 else if (Convert.ToInt32(ipxs[i]) < Convert.ToInt32(ipys[i]))
    170                 {
    171                     return -1;
    172                 }
    173                 else
    174                 {
    175                     continue;
    176                 }
    177             }
    178             return 0;
    179         }
    180         /// <summary>
    181         /// 获取或设置按照哪一列排序.
    182         /// </summary>
    183         public int SortColumn
    184         {
    185             set
    186             {
    187                 ColumnToSort = value;
    188             }
    189             get
    190             {
    191                 return ColumnToSort;
    192             }
    193         }
    194         /// <summary>
    195         /// 获取或设置排序方式.
    196         /// </summary>
    197         public System.Windows.Forms.SortOrder Order
    198         {
    199             set
    200             {
    201                 OrderOfSort = value;
    202             }
    203             get
    204             {
    205                 return OrderOfSort;
    206             }
    207         }
    208     }
    209 }

    以上代码封装后无须更改,在窗体中添加一个ListView控件,在窗体的Load事件中添加如下代码:

    1  private void Form1_Load(object sender, EventArgs e)
    2  {
    3      this.listView1.ListViewItemSorter = new Common.ListViewColumnSorter();
    4      this.listView1.ColumnClick += new ColumnClickEventHandler(Common.ListViewHelper.ListView_ColumnClick);
    5  }
  • 相关阅读:
    modf()函数
    面向对象编程五大原则
    .Net网络资源
    整理CentOS常用命令
    在RHEL5上安装oracle10gLinux
    strchr()函数
    swab函数
    Strstr()函数
    tmpnam函数
    strdup ()函数
  • 原文地址:https://www.cnblogs.com/felix-wang/p/6248909.html
Copyright © 2020-2023  润新知