在看代碼之前需要說明一點:
GridView本身有一个Sort()函数:public virtual void Sort ( string sortExpression, SortDirection sortDirection)使用上相当方便。但在实际使用中,常用的是点击每一列的标题来排序,点击标题会触发:protected void GridView_Sorting(object sender, GridViewSortEventArgs e)事件。从GridViewSortEventArgs中可以拿到SortDirection和SortExpression。但是GridView.Sort()本身也会触发GridView_Sorting(),如果在GridView_Sorting()中调用GridView.Sort()会无限的循环,直到堆栈溢出。這里使用DataView.Sort属性来排序,(Sort方法會觸發
Sorting 事件),再重新綁定到GridView上。
代碼如下:
1、在源碼中給GridView中加入AllowSorting屬性
//
1、在源碼的GridView中加入AllowSorting="true"
<
asp:GridView ID
=
"
gvData
"
runat
=
"
server
"
AllowSorting
=
"
true
"
>
</
asp:GridView
>
2、 ClbComunication.clsComunication類中定義了一個屬性,用於暫存從數據庫得到的資料:
注:定義此屬性是因為頁面顯示后,剛才得的資料表(mdatatable)的資料會被清空。所以將得到的資料暫存於類中,便於調用。
///
<summary>
///
存放資料DataView屬性的變量
///
</summary>
private
static
DataView dvValue
=
new
DataView();
///
<summary>
///
存放資料DataView屬性
///
</summary>
public
static
DataView dv
{
get
{
return
dvValue; }
set
{ dvValue
=
value; }
}
3、將資料放入類的DataView屬性中保存
//
得到資料(BOFactory.bofactory.GetOracleDataTable(mSQL_Selection)為從數據庫得到資料)
DataTable mdatatable
=
BOFactory.bofactory.GetOracleDataTable(mSQL_Selection);
//
將需要排序的資料放入DataView中(主要用到此句)
ClbComunication.clsComunication.dv
=
new
DataView(mdatatable);
//
資料與界面上的GridView綁定
gvData.DataBind();
4、訂閱GridView的Sorting事件
//
GridView的Sorting事件
gvData.Sorting
+=
new
GridViewSortEventHandler(gvData_Sorting);
5、編輯GridView的Sorting事件方法,其中用到的GridViewSortDirection屬性的定義如"6"所示
///
<summary>
///
GridView的Sorting事件方法
///
</summary>
///
<param name="sender"></param>
///
<param name="e"></param>
void
gvData_Sorting(
object
sender, GridViewSortEventArgs e)
{
string
sortExpression
=
e.SortExpression.ToUpper();
if
(GridViewSortDirection
==
SortDirection.Ascending)
{
GridViewSortDirection
=
SortDirection.Descending;
//
排序並重新綁定
bindData(sortExpression,
"
DESC
"
);
}
else
if
(GridViewSortDirection
==
SortDirection.Descending)
{
GridViewSortDirection
=
SortDirection.Ascending;
//
排序並重新綁定
bindData(sortExpression,
"
ASC
"
);
}
}
6、定義排序方向屬性,此属性用viewstate保存每次排序的方向:
///
<summary>
///
排序方向屬性
///
</summary>
public
SortDirection GridViewSortDirection
{
get
{
if
(ViewState[
"
sortDirection
"
]
==
null
)
ViewState[
"
sortDirection
"
]
=
SortDirection.Ascending;
return
(SortDirection)ViewState[
"
sortDirection
"
];
}
set
{
ViewState[
"
sortDirection
"
]
=
value;
}
}
7、排序並綁定數據
///
<summary>
///
排序並綁定數據
///
</summary>
///
<param name="sortExpression"></param>
///
<param name="sortDirection"></param>
protected
void
bindData(
string
sortExpression,
string
sortDirection)
{
ClbComunication.clsComunication.dv.Sort
=
sortExpression;
if
(sortDirection
!=
String.Empty)
{
ClbComunication.clsComunication.dv.Sort
=
sortExpression
+
"
"
+
sortDirection;
}
gvData.DataSource
=
ClbComunication.clsComunication.dv;
gvData.DataBind();
}