單擊列頭實現排序,首先在羡慕中添加下面的幫助實現的類;具體的代碼:
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 }