開發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