使用中继器和SQL定制分页

我一直在寻找一个很好的教程,教我如何使用像Repeater这样的简单DataBound控件来实现自定义的Paging控件,以实现高性能的分页function。

我发现了很多关于这个问题的文章,但没有一个是完整的答案。

  • 在ASP.NET中分析大型结果集

    这个很棒,有统计数据和不同方法之间的比较,但问题是它在SQL Server拥有它的新functionROW_NUMBER()之前已经太旧了

  • 使用ASP.NET 3.5的N层Web应用程序第4部分:排序,分页和过滤(数据库分页部分,忽略其余部分)

    这个几乎是完美的,但他使用网格现有的分页function和定制的分页方法,而不是转发器。

  • 使用ASP.NET Repeater或DataList控件自定义SEO友好分页

    我认为这个过于复杂,事情可以变得更容易

我正在使用SQL,Items Repeater(在没有使用数据源的代码隐藏中使用直接绑定),PageNumbers转发器(它将具有作为ItemTemplate的链接以传递查询字符串,因此使用的方法可以检索项的下一部分),用于保存当前页码和标题的标签。

我一直在尝试使用ASP.NET 3.5第4部分:排序,分页和过滤(数据库分页部分,忽略其余部分)在N层Web应用程序上实现该示例。 到目前为止,我已经在我的数据访问Lyaer中创建了一个SQL命令,如下所示:

WITH Records AS ( SELECT ItemId, ItemName, ROW_NUMBER() OVER (ORDER BY ItemId) AS 'RowNumber' FROM Items) SELECT * FROM Records WHERE (RowNumber BETWEEN (@startIndex) AND @startIndex + @pageSize - 1) 

但现在我被困在如何在我的表示层使用它!

您可以创建自定义方法来呈现自己的分页控件。 这是一个例子:

  ///  /// Produces html for a pagination control. ///  /// Page number for the current page (1-based index). /// Number or items per page. /// Total number of items across all pages. /// Html of a pagination control. public string RenderPaginationControl(int page, int pageSize, int totalItems) { int totalPages = (int)Math.Ceiling((double)totalItems/pageSize); // Create pager. StringBuilder pagerSb = new StringBuilder(); for (int i = 1; i <= totalPages; ++i) { // If it is NOT a link to current page. if (i != page) { pagerSb.Append(string.Format("{0}", i)); } // If it is the link to current page. else { pagerSb.Append(string.Format("{0}", i)); } } return pagerSb.ToString(); } 

除了你的sql之外你还可以看到,你还需要打电话

 SELECT COUNT(*) FROM Items 

并将该值传递给RenderPaginationControl中的 totalItems

就与Repeater的绑定而言 – 它非常直接:

 this.MyRepeater.DataSource = DAL.GetItems(page, pageSize); this.MyRepeater.DataBind(); int totalItems = DAL.GetTotalNumberOfItems(); this.PaginationLabel.Text = RenderPaginationControl(page, pageSize, totalItems);