在ASP.NET 2.0中操作數(shù)據(jù)之四十四:DataList和Repeater數(shù)據(jù)排序(三)
第七步: 在自定義分頁(yè)的Repeater 里添加排序功能
現(xiàn)在已經(jīng)完成了自定義分頁(yè),我們?cè)賮?lái)添加排序功能。ProductsBLL類(lèi)的GetProductsPagedAndSorted方法和GetProductsPaged一樣有startRowIndex 和 maximumRows 參數(shù),不一樣的是它還多了一個(gè)sortExpression 參數(shù)。在SortingWithCustomPaging.aspx里使用GetProductsPagedAndSorted方法我們需要:
將ObjectDataSource的SelectMethod屬性從GetProductsPaged改為GetProductsPagedAndSorted。
為ObjectDataSource的SelectParameters參數(shù)集合增加一個(gè)sortExpression Parameter。
創(chuàng)建一個(gè)私有的屬性用來(lái)在postback過(guò)程中通過(guò)view state存儲(chǔ)SortExpression。
修改ObjectDataSource的Selecting event handler將ObjectDataSource的sortExpression 參數(shù)值賦為SortExpression 屬性(3中創(chuàng)建的)。
創(chuàng)建排序界面。
首先修改ObjectDataSource的SelectMethod屬性并添加sortExpression 參數(shù)。確定sortExpression 的類(lèi)型是String。完成這些后ObjectDataSource的聲明標(biāo)記看起來(lái)應(yīng)該和下面差不多:
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
SelectMethod="GetProductsPagedAndSorted"
OnSelecting="ProductsDataSource_Selecting">
<SelectParameters>
<asp:Parameter Name="sortExpression" Type="String" />
<asp:Parameter Name="startRowIndex" Type="Int32" />
<asp:Parameter Name="maximumRows" Type="Int32" />
</SelectParameters>
</asp:ObjectDataSource>
然后添加一個(gè)SortExpression屬性,它的值為view state。在沒(méi)有設(shè)任何sort expression的值時(shí)候,使用“ProductName”作為默認(rèn)值。
private string SortExpression
{
get
{
object o = ViewState["SortExpression"];
if (o == null)
return "ProductName";
else
return o.ToString();
}
set
{
ViewState["SortExpression"] = value;
}
}
在ObjectDataSource調(diào)用GetProductsPagedAndSorted方法前,我們需要將sortExpression 參數(shù)設(shè)為SortExpression屬性的值。在Selecting event handler里添加以下代碼:
e.InputParameters["sortExpression"] = SortExpression;
現(xiàn)在只需要完成排序界面就可以了。和我們上一個(gè)例子一樣,我們使用3個(gè)button來(lái)實(shí)現(xiàn)排序功能,允許用戶(hù)根據(jù)product name, category, supplier來(lái)排序。
<asp:Button runat="server" id="SortByProductName" Text="Sort by Product Name" /> <asp:Button runat="server" id="SortByCategoryName" Text="Sort by Category" /> <asp:Button runat="server" id="SortBySupplierName" Text="Sort by Supplier" />
為這三個(gè)button都創(chuàng)建Click event handler。在其中將StartRowIndex設(shè)為0,SortExpression設(shè)為相應(yīng)的值,并將數(shù)據(jù)重新綁定到Repeater。
protected void SortByProductName_Click(object sender, EventArgs e)
{
StartRowIndex = 0;
SortExpression = "ProductName";
Products.DataBind();
}
protected void SortByCategoryName_Click(object sender, EventArgs e)
{
StartRowIndex = 0;
SortExpression = "CategoryName";
Products.DataBind();
}
protected void SortBySupplierName_Click(object sender, EventArgs e)
{
StartRowIndex = 0;
SortExpression = "CompanyName";
Products.DataBind();
}
現(xiàn)在所有工作都完成了!實(shí)現(xiàn)自定義分頁(yè)和排序的一些步驟和默認(rèn)分頁(yè)差不多。圖18顯示的當(dāng)按照category排序時(shí)的最后一頁(yè)數(shù)據(jù)。

圖 18: 按Category排序的最后一頁(yè)數(shù)據(jù)
注意:在前面的例子里,當(dāng)按照supplier排序時(shí)排序表達(dá)式為” SupplierName”。然而執(zhí)行自定義分頁(yè)時(shí)我們需要使用” CompanyName”。這是因?yàn)樽远x分頁(yè)的存儲(chǔ)過(guò)程–GetProductsPagedAndSorted–將sort expression傳給ROW_NUMBER(),ROW_NUMBER()需要一個(gè)實(shí)際的列名,而不是別名。因此我們必須使用CompanyName(Suppliers表的一個(gè)列名),而不是使用SupplierName (SELECT語(yǔ)句里的別名)作為expression。
總結(jié)
無(wú)論是DataList還是Repeater都沒(méi)有提供內(nèi)置的排序支持,但是通過(guò)自定義界面和一點(diǎn)點(diǎn)代碼,我們可以實(shí)現(xiàn)這樣的功能。當(dāng)僅僅只實(shí)現(xiàn)排序時(shí)(不包含分頁(yè)),sort expression可以通過(guò)DataSourceSelectArguments對(duì)象傳給ObjectDataSource的Select方法。DataSourceSelectArguments對(duì)象的SortExpression屬性可以在ObjectDataSource的electing event handler里賦值。
為已經(jīng)有排序功能的DataList或Repeater添加排序功能,最簡(jiǎn)單的方法是在BLL里添加一個(gè)接收sort expression的方法。然后這個(gè)信息可以通過(guò)ObjectDataSource的SelectParameters參數(shù)傳進(jìn)去。
祝編程快樂(lè)!
作者簡(jiǎn)介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書(shū),是4GuysFromRolla.com的創(chuàng)始人,自1998年以來(lái)一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對(duì)大家的學(xué)習(xí)ASP.NET有所幫助。
- 讓W(xué)in2008+IIS7+ASP.NET支持10萬(wàn)并發(fā)請(qǐng)求
- c#實(shí)現(xiàn)服務(wù)器性能監(jiān)控并發(fā)送郵件保存日志
- C#線(xiàn)程執(zhí)行超時(shí)處理與并發(fā)線(xiàn)程數(shù)控制實(shí)例
- c#編寫(xiě)的高并發(fā)數(shù)據(jù)庫(kù)控制訪問(wèn)代碼
- C#使用隊(duì)列(Queue)解決簡(jiǎn)單的并發(fā)問(wèn)題
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十一:實(shí)現(xiàn)開(kāi)放式并發(fā)
- 在ASP.NET 2.0中操作數(shù)據(jù)之四十五:DataList和Repeater里的自定義Button
- 在ASP.NET 2.0中操作數(shù)據(jù)之四十六:使用SqlDataSource控件檢索數(shù)據(jù)
- 在ASP.NET 2.0中操作數(shù)據(jù)之四十七:用SqlDataSource控件插入、更新、刪除數(shù)據(jù)
- 在ASP.NET 2.0中操作數(shù)據(jù)之四十八:對(duì)SqlDataSource控件使用開(kāi)放式并發(fā)
相關(guān)文章
NopCommerce架構(gòu)分析之(六)自定義RazorViewEngine和WebViewPage
本文對(duì)NopCommerce的后臺(tái)分離技術(shù)做簡(jiǎn)單的探討。NopCommerce通過(guò)自定義視圖引擎,重寫(xiě)了VirtualPathProviderViewEngine類(lèi)的CreateView、CreatePartialView、FindView、FindPartialView方法,添加自定義的視圖搜索路徑來(lái)實(shí)現(xiàn)后臺(tái)分離。2016-04-04
在ASP.NET 2.0中操作數(shù)據(jù)之六十四:GridView批量添加數(shù)據(jù)
前面介紹了批量更新,批量刪除數(shù)據(jù),這篇文章主要介紹如何實(shí)現(xiàn)批量添加數(shù)據(jù),當(dāng)然為了保證數(shù)據(jù)的完整性,我們?cè)谧鲞@些批量操作的時(shí)候,都使用了事務(wù)來(lái)實(shí)現(xiàn)。2016-05-05
WPF框架Prism中對(duì)話(huà)框Dialog用法介紹
這篇文章介紹了WPF框架Prism中對(duì)話(huà)框Dialog的用法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
在ASP.NET 2.0中操作數(shù)據(jù)之二十六:排序自定義分頁(yè)數(shù)據(jù)
前面教程中我們實(shí)現(xiàn)了高效的自定義分頁(yè),但是只是一種固定排序方式。在本教程中,我們通過(guò)引入@sortExpression來(lái)擴(kuò)展存儲(chǔ)過(guò)程既實(shí)現(xiàn)自定義分頁(yè)又提供自定義排序的功能。2016-05-05
如何在DataGrid控件中實(shí)現(xiàn)自定義分頁(yè)
如何在DataGrid控件中實(shí)現(xiàn)自定義分頁(yè)...2006-10-10
在ASP.NET 2.0中操作數(shù)據(jù)之十八:在ASP.NET頁(yè)面中處理BLL/DAL層的異常
本文主要介紹ASP.NET 2.0中如何在頁(yè)面中處理BLL和DAL層的異常,程序演示了如何在頁(yè)面中顯示友好的異常信息,以及講解了如何在DAL層拋出自定義異常。2016-05-05
在ASP.NET 2.0中操作數(shù)據(jù)之三十五:使用Repeater和DataList單頁(yè)面實(shí)現(xiàn)主/從報(bào)表
前面已經(jīng)介紹了ASP.NET 2.0中如何使用兩個(gè)頁(yè)面實(shí)現(xiàn)主/從報(bào)表,本文主要講解,如何使用一個(gè)單獨(dú)頁(yè)面實(shí)現(xiàn)主/從報(bào)表。2016-05-05
解讀ASP.NET 5 & MVC6系列教程(4):核心技術(shù)與環(huán)境配置
這篇文章主要介紹了ASP.NET 5 核心技術(shù)與環(huán)境配置,需要的朋友可以參考下2016-06-06
Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸
本文主要講解.Net Remoting中的Remoting事件處理,需要的朋友可以參考下。2016-05-05

