在ASP.NET 2.0中操作数据之四十四:DataList和Repeater数据排序(三)
第七步: 在自定义分页的repeater 里添加排序功能
现在已经完成了自定义分页,我们再来添加排序功能。productsbll类的getproductspagedandsorted方法和getproductspaged一样有startrowindex 和 maximumrows 参数,不一样的是它还多了一个sortexpression 参数。在sortingwithcustompaging.aspx里使用getproductspagedandsorted方法我们需要:
将objectdatasource的selectmethod属性从getproductspaged改为getproductspagedandsorted。
为objectdatasource的selectparameters参数集合增加一个sortexpression parameter。
创建一个私有的属性用来在postback过程中通过view state存储sortexpression。
修改objectdatasource的selecting event handler将objectdatasource的sortexpression 参数值赋为sortexpression 属性(3中创建的)。
创建排序界面。
首先修改objectdatasource的selectmethod属性并添加sortexpression 参数。确定sortexpression 的类型是string。完成这些后objectdatasource的声明标记看起来应该和下面差不多:
<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>
然后添加一个sortexpression属性,它的值为view state。在没有设任何sort expression的值时候,使用“productname”作为默认值。
private string sortexpression { get { object o = viewstate["sortexpression"]; if (o == null) return "productname"; else return o.tostring(); } set { viewstate["sortexpression"] = value; } }
在objectdatasource调用getproductspagedandsorted方法前,我们需要将sortexpression 参数设为sortexpression属性的值。在selecting event handler里添加以下代码:
e.inputparameters["sortexpression"] = sortexpression;
现在只需要完成排序界面就可以了。和我们上一个例子一样,我们使用3个button来实现排序功能,允许用户根据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" />
为这三个button都创建click event handler。在其中将startrowindex设为0,sortexpression设为相应的值,并将数据重新绑定到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(); }
现在所有工作都完成了!实现自定义分页和排序的一些步骤和默认分页差不多。图18显示的当按照category排序时的最后一页数据。
图 18: 按category排序的最后一页数据
注意:在前面的例子里,当按照supplier排序时排序表达式为” suppliername”。然而执行自定义分页时我们需要使用” companyname”。这是因为自定义分页的存储过程–getproductspagedandsorted–将sort expression传给row_number(),row_number()需要一个实际的列名,而不是别名。因此我们必须使用companyname(suppliers表的一个列名),而不是使用suppliername (select语句里的别名)作为expression。
总结
无论是datalist还是repeater都没有提供内置的排序支持,但是通过自定义界面和一点点代码,我们可以实现这样的功能。当仅仅只实现排序时(不包含分页),sort expression可以通过datasourceselectarguments对象传给objectdatasource的select方法。datasourceselectarguments对象的sortexpression属性可以在objectdatasource的electing event handler里赋值。
为已经有排序功能的datalist或repeater添加排序功能,最简单的方法是在bll里添加一个接收sort expression的方法。然后这个信息可以通过objectdatasource的selectparameters参数传进去。
祝编程快乐!
作者简介
本系列教程作者 scott mitchell,著有六本asp/asp.net方面的书,是4guysfromrolla.com的创始人,自1998年以来一直应用 微软web技术。大家可以点击查看全部教程《[翻译]scott mitchell 的asp.net 2.0数据教程》,希望对大家的学习asp.net有所帮助。
推荐阅读
-
在ASP.NET 2.0中操作数据之三十四:基于DataList和Repeater跨页面的主/从报表
-
在ASP.NET 2.0中操作数据之三十五:使用Repeater和DataList单页面实现主/从报表
-
在ASP.NET 2.0中操作数据之三十:格式化DataList和Repeater的数据
-
在ASP.NET 2.0中操作数据之二十九:用DataList和Repeater来显示数据
-
在ASP.NET 2.0中操作数据之三十三:基于DataList和Repeater使用DropDownList过滤的主/从报表
-
在ASP.NET 2.0中操作数据之四十三:DataList和Repeater数据排序(二)
-
在ASP.NET 2.0中操作数据之四十二:DataList和Repeater数据排序(一)
-
在ASP.NET 2.0中操作数据之四十一:DataList和Repeater数据分页
-
在ASP.NET 2.0中操作数据之四十五:DataList和Repeater里的自定义Button
-
在ASP.NET 2.0中操作数据之四十四:DataList和Repeater数据排序(三)