C#winform点击ListView列标题进行排序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#winform点击ListView列标题进⾏排序 1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Text.RegularExpressions;
6using System.Windows.Forms;
7
8namespace Common
9 {
10///<summary>
11///点击列标题,对ListView⾃动排序功能
12///</summary>
13public class ListViewHelper
14 {
15///<summary>
16///点击列标题,对ListView列排序
17///</summary>
18///<param name="sender"></param>
19///<param name="e"></param>
20public 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// 检查点击的列是不是现在的排序列.
24if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
25 {
26// 重新设置此列的排序⽅法.
27if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == SortOrder.Ascending)
28 {
29 (lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Descending;
30 }
31else
32 {
33 (lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;
34 }
35 }
36else
37 {
38// 设置排序列,默认为正向排序
39 (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
40 (lv.ListViewItemSorter as ListViewColumnSorter).Order = SortOrder.Ascending;
41 }
42// ⽤新的排序⽅法对ListView排序
43 lv.Sort();
44 }
45 }
46
47///<summary>
48///点击列标题,对ListView列排序功能,继承⾃IComparer
49///</summary>
50public class ListViewColumnSorter : System.Collections.IComparer
51 {
52#region成员变量
53///<summary>
54///指定按照哪个列排序
55///</summary>
56private int ColumnToSort;
57
58///<summary>
59///指定排序的⽅式
60///</summary>
61private System.Windows.Forms.SortOrder OrderOfSort;
62
63///<summary>
64///声明CaseInsensitiveComparer类对象
65///</summary>
66private System.Collections.CaseInsensitiveComparer ObjectCompare;
67#endregion
68
69#region属性
70///<summary>
71///获取或设置按照哪⼀列排序.
72///</summary>
73public int SortColumn
74 {
75set
76 {
77 ColumnToSort = value;
78 }
79get
80 {
81return ColumnToSort;
82 }
83 }
84
85///<summary>
86///获取或设置排序⽅式.
87///</summary>
88public System.Windows.Forms.SortOrder Order
89 {
90set
91 {
92 OrderOfSort = value;
93 }
94get
95 {
96return OrderOfSort;
97 }
98 }
99#endregion
100
101#region构造函数
102///<summary>
103///构造函数
104///</summary>
105public ListViewColumnSorter()
106 {
107// 默认按第⼀列排序
108 ColumnToSort = 0;
109// 排序⽅式为不排序
110 OrderOfSort = System.Windows.Forms.SortOrder.Ascending;
111// 初始化CaseInsensitiveComparer类对象
112 ObjectCompare = new System.Collections.CaseInsensitiveComparer();
113 }
114#endregion
115
116#region公有⽅法
117///<summary>
118///重写IComparer接⼝.
119///</summary>
120///<param name="x">要⽐较的第⼀个对象</param>
121///<param name="y">要⽐较的第⼆个对象</param>
122///<returns>⽐较的结果.如果相等返回0,如果x⼤于y返回1,如果x⼩于y返回-1</returns> 123public int Compare(object x, object y)
124 {
125int compareResult;
126 System.Windows.Forms.ListViewItem listviewX, listviewY;
127// 将⽐较对象转换为ListViewItem对象
128 listviewX = (System.Windows.Forms.ListViewItem)x;
129 listviewY = (System.Windows.Forms.ListViewItem)y;
130string xText = listviewX.SubItems[ColumnToSort].Text;
131string yText = listviewY.SubItems[ColumnToSort].Text;
132
133//此时ListViewX、listviewY的属性项要已经绑定好数据,
134//如:listviewX.SubItems[0].Tag = "10240";
135//如:listviewY.SubItems[0].Tag = "40960";
136//使⽤Tag主要⽤于数字排序,⽐如按⽂件夹的⼤⼩排序,
137//此时Text已经不能转化为数字,因为根据需要,
138//此时Text可能是:100KB,20.4MB这样的字符串
139//string xText = listviewX.SubItems[ColumnToSort].Tag.ToString();
140//string yText = listviewY.SubItems[ColumnToSort].Tag.ToString();
141int xInt, yInt;
142// ⽐较,如果值为IP地址,则根据IP地址的规则排序。

143if (IsIP(xText) && IsIP(yText))
144 {
145 compareResult = CompareIp(xText, yText);
146 }
147else if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字148 {
149//⽐较数字
150 compareResult = CompareInt(xInt, yInt);
151 }
152else
153 {
154//⽐较对象
155 compareResult = pare(xText, yText);
156 }
157// 根据上⾯的⽐较结果返回正确的⽐较结果
158if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
159 {
160// 因为是正序排序,所以直接返回结果
161return compareResult;
162 }
163else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
164 {
165// 如果是反序排序,所以要取负值再返回
166return (-compareResult);
167 }
168else
169 {
170// 如果相等返回0
171return0;
172 }
173 }
174#endregion
175
176#region私有⽅法
177///<summary>
178///判断是否为正确的IP地址,IP范围(0.0.0.0~255.255.255)
179///</summary>
180///<param name="ip">需验证的IP地址</param>
181///<returns></returns>
182private bool IsIP(string ip)
183 {
184return 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)\.
185 (25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.
186 (25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.
187 (25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$").Success;
188 }
189
190///<summary>
191///⽐较两个IP地址的⼤⼩
192///</summary>
193///<param name="ipx">要⽐较的第⼀个对象</param>
194///<param name="ipy">要⽐较的第⼆个对象</param>
195///<returns>⽐较的结果.如果相等返回0,如果x⼤于y返回1,如果x⼩于y返回-1</returns>
196private int CompareIp(string ipx, string ipy)
197 {
198string[] ipxs = ipx.Split('.');
199string[] ipys = ipy.Split('.');
200for (int i = 0; i < 4; i++)
201 {
202if (Convert.ToInt32(ipxs[i]) > Convert.ToInt32(ipys[i]))
203 {
204return1;
205 }
206else if (Convert.ToInt32(ipxs[i]) < Convert.ToInt32(ipys[i]))
207 {
208return -1;
209 }
210else
211 {
212continue;
213 }
214 }
215return0;
216 }
217
218///<summary>
219///⽐较两个数字的⼤⼩
220///</summary>
221///<param name="ipx">要⽐较的第⼀个对象</param>
222///<param name="ipy">要⽐较的第⼆个对象</param>
223///<returns>⽐较的结果.如果相等返回0,如果x⼤于y返回1,如果x⼩于y返回-1</returns>
224private int CompareInt(int x, int y)
225 {
226if (x > y)
227 {
228return1;
229 }
230else if (x < y)
231 {
232return -1;
233 }
234else
235 {
236return0;
237 }
238 }
239#endregion
240 }
241 }
以上代码封装后⽆须更改,在窗体中添加⼀个ListView控件,在窗体的Load事件中添加如下代码:1private void Form1_Load(object sender, EventArgs e)
2 {
3this.listView1.ListViewItemSorter = new Common.ListViewColumnSorter();
4this.listView1.ColumnClick += new ColumnClickEventHandler(Common.ListViewHelper.ListView_ColumnClick);
5 }
转载⾃:
本⼈根据⾃⼰需要,对代码做了少许修改(已注释掉),如下所⽰,如有类似需求,可以尝试使⽤。

相关文档
最新文档