加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

在ASP.NET 2.0中操作数据之四十三:DataList和Repeater数据排序

发布时间:2016-11-23 22:18:32 所属栏目:MsSql教程 来源:站长网
导读:接着上篇介绍,上篇已经通过DropDownList简单实现了排序的功能,下面让我们看看带有分页的排序该怎么做。 第五步: 为使用默认分页的DataList添加排序的支持 打开PagingSortingDataListRepeater文件夹里的SortingWithDefaultPaging.aspx和Paging.aspx 页。

  最后,定义Repeater的ItemTemplate,让它只显示product'的name, category, supplier。完成这些后,Repeater和ObjectDataSource的声明语言看起来应该和下面差不多:

<asp:Repeater ID="Products" runat="server" DataSourceID="ProductsDataSource"
 EnableViewState="False">
 <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}"
 SelectMethod="GetProductsPaged" TypeName="ProductsBLL">
 <SelectParameters>
 <asp:Parameter Name="startRowIndex" Type="Int32" />
 <asp:Parameter Name="maximumRows" Type="Int32" />
 </SelectParameters>
</asp:ObjectDataSource>

  现在浏览该页,注意没有返回任何记录。这是因为我们还没有指定startRowIndex 和 maximumRows 参数的值。为了指定这些值,为ObjectDataSource的Selecting event创建一个event handler,并将参数值硬编码的设置为0和5。

protected void ProductsDataSource_Selecting
 (object sender, ObjectDataSourceSelectingEventArgs e)
{
 e.InputParameters["startRowIndex"] = 0;
 e.InputParameters["maximumRows"] = 5;
}

现在浏览页面时会显示前5条product记录。

/uploads/allimg/c161121/14OI935W9620-K2Z.png
图 14: 显示前5条product

  注意:图14列出的products以product name排序是因为自定义分页使用的GetProductsPaged存储过程返回的结果是以ProductName排序。

  为了让用户可以翻页,我们需要在postback过程中记下start row index 和 maximum rows。在默认分页的例子里我们用querystring来保存这些值。这个例子里我们将使用view state。创建下面两个属性:

private int StartRowIndex
{
 get
 {
 object o = ViewState["StartRowIndex"];
 if (o == null)
  return 0;
 else
  return (int)o;
 }
 set
 {
 ViewState["StartRowIndex"] = value;
 }
}
private int MaximumRows
{
 get
 {
 object o = ViewState["MaximumRows"];
 if (o == null)
  return 5;
 else
  return (int)o;
 }
 set
 {
 ViewState["MaximumRows"] = value;
 }
}

然后更新Selecting event handler的代码,使用StartRowIndex 和 MaximumRows属性代替硬编码的0和5。

e.InputParameters["startRowIndex"] = StartRowIndex;
e.InputParameters["maximumRows"] = MaximumRows;

现在我们的页仍然只显示5条记录。然而完成这些属性后,我们已经可以创建分页界面了。

添加分页界面

  我们还是使用和默认分页例子里一样的First, Previous, Next, Last分页界面,并包含显示当前是哪页和总页数的label。在Repeater下面添加4个button和1一个label。

<p>
 <asp:Button runat="server" ID="FirstPage" Text="<< First" />
 <asp:Button runat="server" ID="PrevPage" Text="< Prev" />
 <asp:Button runat="server" ID="NextPage" Text="Next >" />
 <asp:Button runat="server" ID="LastPage" Text="Last >>" />
</p>
<p>
 <asp:Label runat="server" ID="CurrentPageNumber"></asp:Label>
</p>

  然后为4个button创建Click event handlers。当其中一个button被点时,我们需要修改StartRowIndex并将数据重新绑定到Repeater。First, Previous, 和 Next button的代码都非常简单,但是对Last button来说,我们如何判断最后一页数据的start row index?为了计算出这个index–和判断Next 和 Last button是否应该enabled一样–我们需要知道分页数据的总数。我们可以调用ProductsBLL类的TotalNumberOfProducts()方法来获取这个总数。我们来创建一个只读的属性,名为TotalRowCount,它返回TotalNumberOfProducts()方法的结果。

private int TotalRowCount
{
 get
 {
 // Return the value from the TotalNumberOfProducts() method
 ProductsBLL productsAPI = new ProductsBLL();
 return productsAPI.TotalNumberOfProducts();
 }
}

  有了这个属性后我们现在可以获取最后一页的start row index。它可以通过TotalRowCount除以MaximumRows的结果的整数部分然后乘以MaximumRows来得到。我们现在可以为4个分页界面的button来写Click event handlers。

  最后,在浏览第一页时需要禁用First 和 Previous buttons,在浏览最后一页时要禁用Next 和 Last buttons。在ObjectDataSource的Selecting event handler里添加以下代码:

// Disable the paging interface buttons, if needed
FirstPage.Enabled = StartRowIndex != 0;
PrevPage.Enabled = StartRowIndex != 0;
int LastPageStartRowIndex = ((TotalRowCount - 1) / MaximumRows) * MaximumRows;
NextPage.Enabled = StartRowIndex < LastPageStartRowIndex;
LastPage.Enabled = StartRowIndex < LastPageStartRowIndex;

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读