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 : BindingList
     {
         private  bool  isSortedCore =  true ;
         private  ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
         private  PropertyDescriptor sortPropertyCore =  null ;
         private  string  defaultSortItem;
 
         public  SortableBindingList() :  base () { }
 
         public  SortableBindingList(IList 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 list = ( this .Items  as  List);
             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(this.Model); 实现点击列标题排序的目的了。

你可能感兴趣的:(datagridview 点击列标题排序)