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 }