1.查看 DataProvider生成DataAdapter的类代码,其中有下面三个private成员和一个public属性用做排序
private
string
orderString ;
//
正序,根据用户设置的排序顺序
private
string
reverseOrderString ;
//
反序,与用户设置的排序顺序相反
private
ArrayList orderArray ;
//
存储排序的属性信息
public
ArrayList Order
{
get
{
return
orderArray ;
}
set
{
orderArray
=
value ;
}
}
2.根据DataProvider中设置的属性列新建的枚举类型与允许排序的数据列名称,如下所示:
1
public
enum
Attribute {Note_ID, Note_Title, Class_ID, Class_Name, Note_UpdateTime, Class_Grade, Note_FileName};
2
private
static
String[] attributeNames
=
new
String[] {
"
TM1.[Note_ID]
"
,
"
TM1.[Note_Title]
"
,
"
TM1.[Class_ID]
"
,
"
T2.[Class_Name]
"
,
"
TM1.[Note_UpdateTime]
"
,
"
T2.[Class_Grade]
"
,
"
TM1.[Note_FileName]
"
} ;
3
3.定义排序属性类,此类包含三个成员,OrderAttributeName:排序枚举、OrderAttributeAscending:排序顺序、OrderAttributeString:排序字段
1
public
class
OrderAttribute
2
{
3
public
OrderAttribute( Attribute orderAttributeName ,
4
bool
orderAttributeAscending )
5
{
6
this
.OrderAttributeName
=
orderAttributeName ;
7
this
.OrderAttributeAscending
=
orderAttributeAscending ;
8
this
.OrderAttributeString
=
attributeNames[((
int
)(
this
.OrderAttributeName))] ;
9
}
10
11
public
OrderAttribute( Attribute orderAttributeName )
12
{
13
this
.OrderAttributeName
=
orderAttributeName ;
14
this
.OrderAttributeAscending
=
true
;
15
this
.OrderAttributeString
=
attributeNames[((
int
)(
this
.OrderAttributeName))] ;
16
}
17
18
public
Attribute OrderAttributeName ; //排序枚举
19
public
bool
OrderAttributeAscending ; //排序顺序,true:升序,false:降序
20
public
String OrderAttributeString ; //排序数据列名称
21
}
4.产生Select命令的Order by子句:
1
public
static
string
GetOrderString(ArrayList ListOrder,
bool
AscendingOrder)
2
{
3
string
orderString
=
""
;
4
string
prevString
=
""
;
5
if
( ( ListOrder.Count
>
0
) )
6
{
7
prevString
=
"
ORDER BY
"
;
8
}
9
foreach
( OrderAttribute orderAtt
in
ListOrder )
10
{
11
if
( ( orderAtt.OrderAttributeAscending
==
AscendingOrder ) )
12
{
13
orderString
=
orderString
+
prevString
+
"
"
+
orderAtt.OrderAttributeString ;
14
}
15
else
16
{
17
orderString
=
orderString
+
prevString
+
"
"
+
orderAtt.OrderAttributeString
+
"
DESC
"
;
18
}
19
prevString
=
"
,
"
;
20
}
21
return
orderString;
22
}
5.查询数据时获取Order by子句语句,注意看标注为红色的代码行,得到Order by子句保存在orderString和reverseOrderString成员,最后在执行executePrivate方法时使用orderString中保存的子句组成最终的Select查询语句:
1
public
virtual
int
FillPage( ClassNoteListDataSet dataSet ,
2
int
startRow ,
3
int
maxRows )
4
{
5
this
.Initialize( ) ;
6
ClassNoteListSet
=
dataSet ;
7
rowClassNote
=
ClassNoteListSet.ClassNote.NewClassNoteRow() ;
8
orderString = GetOrderString
(
this
.Order,
true
) ; //获取正序的Order by子句
9
reverseOrderString = GetOrderString
(
this
.Order,
false
) ; //获取反序的Order by 子句
10
try
11
{
12
executePrivate( startRow, maxRows) ;
13
}
14
finally
15
{
16
this
.Cleanup();
17
}
18
return
0
;
19
}
6.使用动态排序:
1
2
ClassNoteListDataAdapter dataAdapter
=
new
ClassNoteListDataAdapter();
3
dataAdapter.Order.Clear();//此处很重要
4
dataAdapter.Order.Add(
new
ClassNoteListDataAdapter.OrderAttribute(ClassNoteListDataAdapter.Attribute.Class_ID,
false
));
5
dataAdapter.Order.Add(
new
ClassNoteListDataAdapter.OrderAttribute(ClassNoteListDataAdapter.Attribute.Note_UpdateTime,
true
));
6
dataAdapter.Fill(..);
7
8
DeKlarit排序介绍完毕,DeKlarit使用的排序方式值得借鉴,属于强类型的排序处理。