在ASP.NET 2.0中操作數(shù)據(jù)之四十四:DataList和Repeater數(shù)據(jù)排序(三)
第七步: 在自定義分頁的Repeater 里添加排序功能
現(xiàn)在已經(jīng)完成了自定義分頁,我們再來添加排序功能。ProductsBLL類的GetProductsPagedAndSorted方法和GetProductsPaged一樣有startRowIndex 和 maximumRows 參數(shù),不一樣的是它還多了一個(gè)sortExpression 參數(shù)。在SortingWithCustomPaging.aspx里使用GetProductsPagedAndSorted方法我們需要:
將ObjectDataSource的SelectMethod屬性從GetProductsPaged改為GetProductsPagedAndSorted。
為ObjectDataSource的SelectParameters參數(shù)集合增加一個(gè)sortExpression Parameter。
創(chuàng)建一個(gè)私有的屬性用來在postback過程中通過view state存儲SortExpression。
修改ObjectDataSource的Selecting event handler將ObjectDataSource的sortExpression 參數(shù)值賦為SortExpression 屬性(3中創(chuàng)建的)。
創(chuàng)建排序界面。
首先修改ObjectDataSource的SelectMethod屬性并添加sortExpression 參數(shù)。確定sortExpression 的類型是String。完成這些后ObjectDataSource的聲明標(biāo)記看起來應(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。在沒有設(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來實(shí)現(xiàn)排序功能,允許用戶根據(jù)product name, category, supplier來排序。
<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)自定義分頁和排序的一些步驟和默認(rèn)分頁差不多。圖18顯示的當(dāng)按照category排序時(shí)的最后一頁數(shù)據(jù)。
圖 18: 按Category排序的最后一頁數(shù)據(jù)
注意:在前面的例子里,當(dāng)按照supplier排序時(shí)排序表達(dá)式為” SupplierName”。然而執(zhí)行自定義分頁時(shí)我們需要使用” CompanyName”。這是因?yàn)樽远x分頁的存儲過程–GetProductsPagedAndSorted–將sort expression傳給ROW_NUMBER(),ROW_NUMBER()需要一個(gè)實(shí)際的列名,而不是別名。因此我們必須使用CompanyName(Suppliers表的一個(gè)列名),而不是使用SupplierName (SELECT語句里的別名)作為expression。
總結(jié)
無論是DataList還是Repeater都沒有提供內(nèi)置的排序支持,但是通過自定義界面和一點(diǎn)點(diǎn)代碼,我們可以實(shí)現(xiàn)這樣的功能。當(dāng)僅僅只實(shí)現(xiàn)排序時(shí)(不包含分頁),sort expression可以通過DataSourceSelectArguments對象傳給ObjectDataSource的Select方法。DataSourceSelectArguments對象的SortExpression屬性可以在ObjectDataSource的electing event handler里賦值。
為已經(jīng)有排序功能的DataList或Repeater添加排序功能,最簡單的方法是在BLL里添加一個(gè)接收sort expression的方法。然后這個(gè)信息可以通過ObjectDataSource的SelectParameters參數(shù)傳進(jìn)去。
祝編程快樂!
作者簡介
本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創(chuàng)始人,自1998年以來一直應(yīng)用 微軟Web技術(shù)。大家可以點(diǎn)擊查看全部教程《[翻譯]Scott Mitchell 的ASP.NET 2.0數(shù)據(jù)教程》,希望對大家的學(xué)習(xí)ASP.NET有所幫助。
- 讓W(xué)in2008+IIS7+ASP.NET支持10萬并發(fā)請求
- c#實(shí)現(xiàn)服務(wù)器性能監(jiān)控并發(fā)送郵件保存日志
- C#線程執(zhí)行超時(shí)處理與并發(fā)線程數(shù)控制實(shí)例
- c#編寫的高并發(fā)數(shù)據(jù)庫控制訪問代碼
- C#使用隊(duì)列(Queue)解決簡單的并發(fā)問題
- 在ASP.NET 2.0中操作數(shù)據(jù)之二十一:實(shí)現(xiàn)開放式并發(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ù)之四十八:對SqlDataSource控件使用開放式并發(fā)
相關(guān)文章
在MacOS+Linux+Nginx中發(fā)布和部署Asp.Net?Core
這篇文章介紹了在MacOS+Linux+Nginx中發(fā)布和部署Asp.Net?Core,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12NopCommerce架構(gòu)分析之(三)EntityFramework數(shù)據(jù)庫初試化及數(shù)據(jù)操作
本文介紹IStartupTask,該類會在系統(tǒng)啟動時(shí)執(zhí)行,IStartupTask調(diào)用IEfDataProvider進(jìn)行數(shù)據(jù)庫的初始化。2016-04-04解讀ASP.NET 5 & MVC6系列教程(11):Routing路由
這篇文章主要介紹了ASP.NET 5 Routing路由的用法,雖然ASP.NET 5 和MVC6的路由使用方式很簡單,但是相關(guān)的使用規(guī)則卻很復(fù)雜,大家使用的時(shí)候需要多加注意。2016-06-06在ASP.NET 2.0中操作數(shù)據(jù)之二十三:基于用戶對修改數(shù)據(jù)進(jìn)行限制
本文主要介紹ASP.NET 2.0如何限制用戶修改數(shù)據(jù),說白了,就是如何控制權(quán)限,讓有權(quán)限的人才能修改,沒有權(quán)限的人只能查看數(shù)據(jù)。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之十九:給編輯和新增界面增加驗(yàn)證控件
本文主要介紹如何對GridView和DetailsView的新增、編輯功能進(jìn)行完善,將原來自動生成的綁定列轉(zhuǎn)換為模板列,進(jìn)而增加驗(yàn)證控件,有助于更多了解ASP.NET 2.0中新的特性。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之三十四:基于DataList和Repeater跨頁面的主/從報(bào)表
前面介紹了使用GridView實(shí)現(xiàn)跨頁面的主/從報(bào)表,同樣DataList和Repeater也可以實(shí)現(xiàn)相同功能。2016-05-05在ASP.NET 2.0中操作數(shù)據(jù)之六十二:GridView批量更新數(shù)據(jù)
GridView控件內(nèi)置的編輯功能只能對每行進(jìn)行編輯,做不到批量編輯。為此,我們需要將GridView里的列轉(zhuǎn)換為TemplateFields,通過一個(gè)單獨(dú)的“Update All”按鈕,在按鈕的事件中批量處理每一行。2016-05-05《解剖PetShop》之四:PetShop之ASP.NET緩存
本文主要講解PetShop4.0的ASP.NET緩存,極大的提高的網(wǎng)站的性能,需要的朋友可以參考下。2016-05-05