Asp.Net GridView點擊標題排序方法

今天需要用到在GridView中點擊標題排序,琢磨了半天,終於成功了。在看代碼之前需要說明一點:

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 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();

}

其它參考:

http://www.cnblogs.com/jackyrong/archive/2006/05/26/409788.html

http://stlh.blogspot.com/2008/02/gridview-sort.html