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  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM