Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序(三)
第七步: 在自定義分頁的Repeater 里添加排序功能
現(xiàn)在已經(jīng)完成了自定義分頁,我們?cè)賮硖砑优判蚬δ堋roductsBLL類的GetProductsPagedAndSorted方法和GetProductsPaged一樣有startRowIndex 和 maximumRows 參數(shù),不一樣的是它還多了一個(gè)sortExpression 參數(shù)。在SortingWithCustomPaging.aspx里使用GetProductsPagedAndSorted方法我們需要:
首先修改ObjectDataSource的SelectMethod屬性并添加sortExpression 參數(shù)。確定sortExpression 的類型是String。完成這些后ObjectDataSource的聲明標(biāo)記看起來應(yīng)該和下面差不多:
| ASP.NET | |
| 1 2 3 4 5 6 7 8 9 10 | <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> |
Next, we need a page-level SortExpression property whose value is serialized to view state. If no sort expression value has been set, use “ProductName” as the default:
然后添加一個(gè)SortExpression屬性,它的值為view state。在沒有設(shè)任何sort expression的值時(shí)候,使用“ProductName”作為默認(rèn)值。
| C# | |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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里添加以下代碼:
| C# | |
| 1 | e.InputParameters["sortExpression"] = SortExpression; |
現(xiàn)在只需要完成排序界面就可以了。和我們上一個(gè)例子一樣,我們使用3個(gè)button來實(shí)現(xiàn)排序功能,允許用戶根據(jù)product name, category, supplier來排序。
| ASP.NET | |
| 1 2 3 4 5 6 | <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。
| C# | |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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分頁的存儲(chǔ)過程–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對(duì)象傳給ObjectDataSource的Select方法。DataSourceSelectArguments對(duì)象的SortExpression屬性可以在ObjectDataSource的electing event handler里賦值。
為已經(jīng)有排序功能的DataList或Repeater添加排序功能,最簡單的方法是在BLL里添加一個(gè)接收sort expression的方法。然后這個(gè)信息可以通過ObjectDataSource的SelectParameters參數(shù)傳進(jìn)去。
本章完成了DataList和Repeater的分頁和排序。下一章,也就是最后一章,我們將學(xué)習(xí)如何在DataList和Repeater的templates(模板)里添加Button,用來提供一些自定義的基于但個(gè)item(項(xiàng))的功能。
祝編程愉快!
總結(jié)
以上是生活随笔為你收集整理的Scott Mitchell 的ASP.NET 2.0数据教程之四十五::DataList和Repeater数据排序(三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站规划
- 下一篇: iframe框架大小自适应