datagridview 點擊列標題排序

datagridview 點擊列標題排序html

裝載:做者:大亨夢 出處:http://www.cnblogs.com/fer-team/ 程序員知識庫:http://www.5uzh.com 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

開發winform中,平時常常用到數據列表,咱們大多選用datagridview,可是此控件自己沒有排序的功能。參閱網上資料。留下標記,之後備用。程序員

datagridview的數據顯示通常是經過數據綁定來實現,ide

 即:this.datagridview.DataSource=this.bindingSrc;post

      this.bindingSrc.DataSource=this.Model;this

 

這種形式就完成了,數據的顯示過程。可是要實現點擊datagridview實現排序的功能,須要實現對數據源排序的功能。具體代碼以下:url

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
public class SortableBindingList<T> : BindingList<T>
     {
         private bool isSortedCore = true ;
         private ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
         private PropertyDescriptor sortPropertyCore = null ;
         private string defaultSortItem;
 
         public SortableBindingList() : base () { }
 
         public SortableBindingList(IList<T> list) : base (list) { }
 
         protected override bool SupportsSortingCore
         {
             get { return true ; }
         }
 
         protected override bool SupportsSearchingCore
         {
             get { return true ; }
         }
 
         protected override bool IsSortedCore
         {
             get { return isSortedCore; }
         }
 
         protected override ListSortDirection SortDirectionCore
         {
             get { return sortDirectionCore; }
         }
 
         protected override PropertyDescriptor SortPropertyCore
         {
             get { return sortPropertyCore; }
         }
 
         protected override int FindCore(PropertyDescriptor prop, object key)
         {
             for ( int i = 0; i < this .Count; i++)
             {
                 if (Equals(prop.GetValue( this [i]), key)) return i;
             }
             return -1;
         }
 
         protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
         {
             isSortedCore = true ;
             sortPropertyCore = prop;
             sortDirectionCore = direction;
             Sort();
         }
 
         protected override void RemoveSortCore()
         {
             if (isSortedCore)
             {
                 isSortedCore = false ;
                 sortPropertyCore = null ;
                 sortDirectionCore = ListSortDirection.Ascending;
                 Sort();
             }
         }
 
         public string DefaultSortItem
         {
             get { return defaultSortItem; }
             set
             {
                 if (defaultSortItem != value)
                 {
                     defaultSortItem = value;
                     Sort();
                 }
             }
         }
 
         private void Sort()
         {
             List<T> list = ( this .Items as List<T>);
             list.Sort(CompareCore);
             ResetBindings();
         }
 
         private int CompareCore(T o1, T o2)
         {
             int ret = 0;
             if (SortPropertyCore != null )
             {
                 ret = CompareValue(SortPropertyCore.GetValue(o1), SortPropertyCore.GetValue(o2), SortPropertyCore.PropertyType);
             }
             if (ret == 0 && DefaultSortItem != null )
             {
                 PropertyInfo property = typeof (T).GetProperty(DefaultSortItem, BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.IgnoreCase, null , null , new Type[0], null );
                 if (property != null )
                 {
                     ret = CompareValue(property.GetValue(o1, null ), property.GetValue(o2, null ), property.PropertyType);
                 }
             }
             if (SortDirectionCore == ListSortDirection.Descending) ret = -ret;
             return ret;
         }
 
         private static int CompareValue( object o1, object o2, Type type)
         {
 
             if (o1 == null ) return o2 == null ? 0 : -1;
             else if (o2 == null ) return 1;
             else if (type.IsPrimitive || type.IsEnum) return Convert.ToDouble(o1).CompareTo(Convert.ToDouble(o2));
             else if (type == typeof (DateTime)) return Convert.ToDateTime(o1).CompareTo(o2);
             else return String.Compare(o1.ToString().Trim(), o2.ToString().Trim());
         }
     }

 實現此類後,就能夠經過 this.bindingSrc.DataSource=new SortableBindingList<CnsDetailReport>(this.Model); 直接在給datagridview數據源綁定值時加上便可,無需其餘設置 。spa

實現點擊列標題排序的目的了。code

相關文章
相關標籤/搜索