zoukankan      html  css  js  c++  java
  • 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  }
  • 相关阅读:
    SPOJ GSS4 Can you answer these queries IV ——树状数组 并查集
    SPOJ GSS3 Can you answer these queries III ——线段树
    SPOJ GSS2 Can you answer these queries II ——线段树
    SPOJ GSS1 Can you answer these queries I ——线段树
    BZOJ 2178 圆的面积并 ——Simpson积分
    SPOJ CIRU The area of the union of circles ——Simpson积分
    HDU 1724 Ellipse ——Simpson积分
    HDU 1071 The area ——微积分
    HDU 4609 3-idiots ——FFT
    BZOJ 2194 快速傅立叶之二 ——FFT
  • 原文地址:https://www.cnblogs.com/felix-wang/p/6248909.html
Copyright © 2011-2022 走看看