当前位置: 移动技术网 > IT编程>开发语言>.net > 在ASP.NET 2.0中操作数据之四十二:DataList和Repeater数据排序(一)

在ASP.NET 2.0中操作数据之四十二:DataList和Repeater数据排序(一)

2017年12月12日  | 移动技术网IT编程  | 我要评论

unihub总裁,给力大辞典注册码,酷骑单车怎么锁车

导言

  datalist和repeater数据分页里我们学习了如何在datalist里添加分页功能。我们在productsbll类里创建了一个名为getproductsaspageddatasource的方法,它返回一个pageddatasource对象。当绑定到datalist或repeater时,他们将只显示请求页的数据。这个技术和gridview,detailsview,formview的内置分页功能原理差不多。

  除了分页外,gridview还提供了内置的排序功能,而datalist和repeater都没有。然而排序功能可以通过一点点代码就实现。本章我们将学习如何在datalist和repeater里实现排序功能,我们还将创建一个同时支持分页和排序的datalist或repeater。

回顾一下排序

  如我们在分页和排序报表数据里看到的,gridview提供了排序的支持。每个gridview的字段可以有一个关联的sortexpression,它指明了对数据进行排序依据的字段。当gridview的allowsorting属性设为true时,每个包含sortexpression 属性的gridview的字段的header都表现为一个linkbutton。当点一个header时,页面postback,数据会根据被点字段的sortexpression进行排序。另外,sortdirection属性指明了数据是升序或降序。

  当将gridview绑定到数据源控件时,它会将sortexpression和sortdirection传给数据源控件。数据源控件获取数据并根据sortexpression和sortdirection进行排序。然后将数据返回给gridview。

在datalist或repeater里实现这个功能,我们需要: 

  创建一个排序界面
  将排序的字段和方向(升序或降序)记下
  指导objectdatasource根据特定字段排序

  我们将在第三和四步来处理上面三个步骤。然后我们将看看如何让datalist或repeater同时支持这两个功能(分页和排序)。

第二步: 在 repeater里显示 products

  在实现排序功能前,首先创建一个列出所有product的repeater。打开pagingsortingdatalistrepeater文件夹里的sorting.aspx页。添加一个repeater,将id设为sortableproducts。从智能标签里创建一个名为productsdatasource的objectdatasource。用productsbll类的getproducts()方法配置它。在insert, update, delete标签的下拉列表里选择“(none)”。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909128629.jpg
图 1: 创建 objectdatasource

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909129915.jpg
图 2: 在 update, insert, delete 标签的下拉列表里选择 “(none)”

  在绑定到数据源后,visual studio没有自动为repeater创建itemtemplate,这点和datalist不一样。而且由于repeater控件的智能标签里没有象datalist里那样的“edit templates”选项,因此我们需要直接添加声明代码。我们使用和前一章一样的itemtemplate,它显示product的 name, supplier, category。

  现在你的repeater和objectdatasource的声明标记看起来应该和下面差不多:

<asp:repeater id="sortableproducts" datasourceid="productsdatasource"

 enableviewstate="false" runat="server">

 <itemtemplate>

  <h4><asp:label id="productnamelabel" runat="server"

   text='<%# eval("productname") %>'></asp:label></h4>

  category:

  <asp:label id="categorynamelabel" runat="server"

   text='<%# eval("categoryname") %>'></asp:label><br />

  supplier:

  <asp:label id="suppliernamelabel" runat="server"

   text='<%# eval("suppliername") %>'></asp:label><br />

  <br />

  <br />

 </itemtemplate>  

</asp:repeater>

<asp:objectdatasource id="productsdatasource" runat="server"

 oldvaluesparameterformatstring="original_{0}" typename="productsbll"

 selectmethod="getproducts">

</asp:objectdatasource>

图 3 是现在浏览该页的样子。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909125430.jpg
图 3: 显示 product的 name, supplier, category

第三步: 指导 objectdatasource 对数据进行排序

  为了让repeater里显示的数据排序,我们需要将数据排序的sort expression告诉objectdatasource。在objectdatasource获取数据前,首先激发的是selecting event,它给我们提供了一个指定sort expression的机会。selecting event handler 有一个objectdatasourceselectingeventargs 类型的参数,它有一个名为arguments的 datasourceselectarguments类型的属性.。datasourceselectarguments类被设计用来将数据相关的请求从数据的消费者传给数据源控件,它有一个sortexpression property。

  创建一个selecting event handler,用以下代码将排序的信息从asp.net页传给objectdatasource:

protected void productsdatasource_selecting

 (object sender, objectdatasourceselectingeventargs e)

{

 e.arguments.sortexpression = sortexpression;

}

  sortexpression 需要赋值为排序字段的名字(例如“productname”)。它没有排序方向相关的属性,因此如果需要以降序来排序,将“desc”附加在sortexpression 的值后面(比如“productname desc”)。

  继续试一下硬编码将sortexpression 赋为不同的值,并浏览页面 。如图4,当使用“productname desc”作为sortexpression时,product会根据name的字母顺序反向排序。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909136715.jpg
图 4: product 根据name 的字母顺序反向排序

第四步: 创建排序界面并记下sort expression 和 direction

  开启gridview的排序支持会将每个可排序的字段的header text转换为一个linkbutton,当被点击时,会进行相对应的排序。这样的排序对gridview来说是很合理的,因为它的数据是以列的形式整齐的展示。而对datalist和repeater来说,需要不同的排序界面。一个常见的数据列表(相对于数据网格)的排序界面是使用一个提供排序字段的下拉列表。我们本章将完成这样的界面。

  在sortableproducts repeater上方添加一个dropdownlist,将id设为sortby。在属性窗口里点items属性打开listitem集合编辑器。添加listitems,让数据根据productname, categoryname, suppliername 字段排序。同时添加listitem让product根据反向的name的顺序排序。

  listitem的text属性可以设为任何值(比如“name”),但是value必须设为数据字段的名字(比如“productname”)。添加字符串“desc”到数据字段名字后面,来让结果以降序排序,比如“productname desc”。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909136087.jpg
图 5:为每个可排序的字段添加 listitem

  最后在dropdownlist的右边添加一个button。将id设为refreshrepeater,text设为“refresh”。

  完成这些后,dropdownlist和button的声明语法看起来应该和下面差不多:

<asp:dropdownlist id="sortby" runat="server">

 <asp:listitem value="productname">name</asp:listitem>

 <asp:listitem value="productname desc">name (reverse order)

  </asp:listitem>

 <asp:listitem value="categoryname">category</asp:listitem>

 <asp:listitem value="suppliername">supplier</asp:listitem>

</asp:dropdownlist>

<asp:button runat="server" id="refreshrepeater" text="refresh" />

完成dropdownlist后,我们需要更新objectdatasource的selecting event handler,来让它使用选择的sortby listitem的value作为sort expression,代替前面的硬编码。


protected void productsdatasource_selecting

 (object sender, objectdatasourceselectingeventargs e)

{

 // have the objectdatasource sort the results by the selected

 // sort expression

 e.arguments.sortexpression = sortby.selectedvalue;

}

  现在第一次浏览页的时候,由于默认的sortby listitem 的值为productname,因此product会根据productname字段来排序。见图6。选择一个其它的项–比如“category”–然后点refresh,这时会postback,数据会根据category name来重新排序,见图7。

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909139129.jpg
图 6: 第一次 products 根据 name 排序

http://www.lhsxpumps.com/_images/10qianwan/20171212/b_1_201712121909141416.jpg
图 7: 现在 products 根据 category 来排序

  注意:点refresh button会让数据重新排序是因为repeater的view state被禁用了,因此repeater在每次postback时重新绑定到数据源。如果你开启repeater的view state,这时改变drop-down list不会对排序有任何影响。为了修复这个问题,你可以为refresh button的 click event创建一个event handler,来重新绑定repeater到数据源(调用repeater的databind()方法)。

  记下sort expression 和 direction(排序表达式和排序方向)

  如果包含可排序的datalist或repeater的页可能有其它和排序无关的postback发生,那么我们需要在postback过程中记下sort expression 和 direction。比如,我们将本章的repeater修改成为每个product包含一个delete button。当用户点delete button时我们会执行一些代码来删除选择的product,然后将数据绑定到repeater。如果排序的信息在postback过程中没有被保存下来,那么显示的数据会回复到最初的排序状态。

  本章里,dropdownlist隐式的为我们将sort expression 和 direction保存在它的view state里。如果我们使用不同的排序界面–linkbutton提供不同的排序选项–我们就需要在postback过程中记下排序的信息。这个可以通过将排序的参数记在page的view state里,或者记在querystring里,或者通过一些其它状态保存机制来实现。

  祝编程快乐!

作者简介

  本系列教程作者 scott mitchell,著有六本asp/asp.net方面的书,是4guysfromrolla.com的创始人,自1998年以来一直应用 微软web技术。大家可以点击查看全部教程《[翻译]scott mitchell 的asp.net 2.0数据教程》,希望对大家的学习asp.net有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网