摘 要:在ASP.NET 2.0中GridView控件代替了ASP.NET 1.1中的DataGrid控件,該控件通常用于顯示數據庫查詢結果。排序是我們在處理數據時經常會碰到的一類操作,GridView控件支持順序排序和逆序排序。本文介紹在GridView控件中實現排序功能的三種方法。
關鍵詞:GridView 排序
在ASP.NET 2.0中可以使用GridView控件自帶的AllowSorting屬性、AJAX技術或用戶自定義方式來實現排序功能。下面我們具體介紹這三種方法。
一、設置AllowSorting屬性來實現排序
只要用過GridView控件的就會發現實現排序功能很簡單,只需要把該控件的AllowSorting屬性設置為True就可以實現了。代碼清單1中的頁面演示如何對Pubs數據庫中的jobs數據表進行排序。
代碼清單1 SortGrid.aspx
<body>
<form id=″form1″ runat=″server″>
<div>
<asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
DataSourceID=″SqlDataSource1″></asp:GridView>
<asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
</div>
</form>
</body>
當AllowSorting屬性設置為True的時候,GridView的列標題就變成鏈接。點擊列標題,就可以根據選中的列對GridView中的記錄進行排序。但是要注意,當顯式指定GridView控件的列時,例如綁定列,則需要指定列的SortExpression值才能支持排序,否則,點擊此列的標題不會對數據排序。具體實現如代碼清單2所示。
代碼清單2
<body>
<form id=″form1″ runat=″server″>
<div>
<asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
AutoGenerateColumns=″1″ DataSourceID=″SqlDataSource1″>
<Columns>
<asp:BoundFieldDataField=″job_id″HeaderText=″job_id″
SortExpression=″job_id″/>
<asp:BoundFieldDataField=″job_desc″ HeaderText=″job_desc″
SortExpression=″job_desc″/>
<asp:BoundFieldDataField=″min_lvl″ HeaderText=″min_lvl″
SortExpression=″min_lvl″/>
<asp:BoundFieldDataField=″max_lvl″ HeaderText=″max_lvl″
SortExpression=″max_lvl″/>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
</div>
</form>
</body>
二、 使用AJAX排序
默認情況下,無論何時在GridView中點擊列名時將觸發整頁的PostBack,使包含此控件的頁面都會回發到服務器端。但更多時候我們只想對頁面GridView控件中的數據進行排序,而頁面中其他內容不動,使用AJAX(Asynchronous JavaScript and XML)技術可以實現該操作。在聲明GridView的時候將EnableSortingAndPagingCallbacks屬性設置為True就可以啟用AJAX。代碼清單3中的頁面在排序的時候就使用了AJAX。
代碼清單3 AjaxSort.aspx
<body>
<form id=″form1″ runat=″server″>
<div>
<%=DateTime.Now.ToString() %>
<asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
EnableSortingAndPagingCallbacks=″true″
DataSourceID=″SqlDataSource1″></asp:GridView>
<asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
</div>
</form>
</body>
在代碼清單3中,在頁面的頂部顯示當前時間。但是在GridView中排序數據的時候這個時間并沒有改變,這就說明并不是整個頁面都被提交給服務器端,只有GridView控件的內容被提交更新。
三、 用戶自定義排序界面
多次點擊列標題,記錄就會在順序和逆序之間進行切換,但是在列標題上沒有一個顯示升序降序的圖標,這會讓最終用戶使用時產生迷惑,因為不知道是升序了還是降序了。避免這種情況可以通過響應GridView控件的RowDataBound事件定制排序鏈接的外觀。在為GridView控件綁定到數據源后,呈現每一行記錄時都會觸發這個事件。代碼清單4就用圖片來顯示數據列的排序狀態。
代碼清單4 ImageSorting.aspx
<body>
<form id=″form1″ runat=″server″>
<div>
<asp:GridView ID=″grdJobs″ runat=″Server″ AllowSorting=″true″
DataSourceID=″SqlDataSource1″
OnRowDataBound=″grdJobs_RowDataBound″></asp:GridView>
<asp:SqlDataSource ID=″SqlDataSource1″ runat=″server″ ConnectionString=″<%$ ConnectionStrings:pubsConnectionString %>″
SelectCommand=″SELECT * FROM [jobs]″></asp:SqlDataSource>
</div>
</form>
</body>
當用戶點擊列標題時,將觸發事件protected void grdJobs_RowDataBound(object sender, GridViewRowEventArgs e),其程序代碼如下:
protected void grdJobs_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
foreach (TableCell cell in e.Row.Cells)
{
LinkButton SortLink = (LinkButton)cell.Controls;
if (SortLink.Text == grdJobs.SortExpression)
{
if(grdJobs.SortDirection == SortDirection.Ascending)
SortLink.Text += ″<img src=’asc.gif’ title=’Sort ascending’>″;
else
SortLink.Text += ″<img src=’desc.gif' title=’Sort descending’>″;
}
}
}
}
在代碼清單4中,圖片是通過grdJobs_RowDataBound方法添加到標題行的。當前行的RowType屬性用來確定當前行是否是標題行,然后,在選中排序列的LinkButton中添加一個HTML<img>標簽。
該頁面執行后結果如圖1所示。用戶從圖1中可以看到在job_id列標題旁有個向下的箭頭,就很清楚現在GridView控件中的數據是按job_id降序顯示的。當用戶再次點擊job_id列標題時,該標題旁會有個向上的箭頭,表示當前是升序顯示。

總之,ASP.NET 2.0中的GridView控件的排序功能簡單、快捷,而且很容易掌握。上述的三種方法,基本上可以滿足用戶的需求,用戶可以根據自己的需要選擇適合自己的方法。
參考文獻:
[1]Stephen Walther,ASP.NET 2.0揭秘.人民郵電出版社,2007年10月.
[2]江廣順,余松.ASP.NET 2.0+SQL Server熱門網絡應開開發詳解.人民郵電出版社,2007年3月.