datagridview 點擊列標題排序


開發winform中,平時經常用到數據列表,我們大多選用datagridview,但是此控件本身沒有排序的功能。參閱網上資料。留下標記,以后備用。

datagridview的數據顯示一般是通過數據綁定來實現,

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

      this.bindingSrc.DataSource=this.Model;

 

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

 

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); 實現點擊列標題排序的目的了。


免責聲明!

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



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