datagridview 点击列标题排序

datagridview 点击列标题排序

装载:作者:大亨梦 出处:http://www.cnblogs.com/fer-team/ 程序员知识库:http://www.5uzh.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

开发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); 直接在给datagridview数据源绑定值时加上即可,无需其他设置 。

实现点击列标题排序的目的了。

转载于:https://www.cnblogs.com/mmnyjq/p/4795101.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值