开发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
{
private
bool
isSortedCore =
true
;
private
ListSortDirection sortDirectionCore = ListSortDirection.Ascending;
private
PropertyDescriptor sortPropertyCore =
null
;
private
string
defaultSortItem;
public
SortableBindingList() :
base
() { }
public
SortableBindingList(IList
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
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