我一直在寻找一个好的教程来教我如何使用简单的DataBound控件(如Repeater)来制作自定义的Paging控件,以实现高性能的分页功能。
我找到了很多有关该问题的文章,但没有一个是完整的答案。
这是一个了不起的工具,它具有统计信息,并且在不同方法之间进行了很好的比较,但是问题在于,在SQL Server使用新功能ROW_NUMBER()之前,它已经太旧了。
这几乎是完美的,但是他使用了网格的现有分页功能,并使用了自定义的分页方法来代替分页器。
我认为这太复杂了,事情可以轻松完成
我使用的是SQL,Items Repeater(在代码背后直接绑定,没有使用任何数据源),PageNumbers Repeater(它将链接作为ItemTemplate传递查询字符串,以便所使用的方法可以检索Items的下一部分),一个用于保存当前页码和标题的标签。
我一直在尝试使用ASP.NET 3.5 __在 N层Web应用程序上实现该示例,第4部分:排序,分页和筛选 (数据库分页部分,其余部分忽略) 。到目前为止,我已经在Data Access 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)
但现在我在演示文稿层中停留在如何使用它上!
您可以创建一个自定义方法来呈现自己的分页控件。这是一个例子:
/// <summary> /// Produces html for a pagination control. /// </summary> /// <param name="page">Page number for the current page (1-based index).</param> /// <param name="pageSize">Number or items per page.</param> /// <param name="totalItems">Total number of items across all pages.</param> /// <returns>Html of a pagination control.</returns> 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("<a href='/data.aspx?page={0}'>{0}</a>", i)); } // If it is the link to current page. else { pagerSb.Append(string.Format("<span>{0}</span>", i)); } } return pagerSb.ToString(); }
如您所见,除了sql之外,您还需要调用
SELECT COUNT(*) FROM Items
并通过该值 TOTALITEMS 在 RenderPaginationControl 。
就与Repeater的绑定而言,这很简单:
this.MyRepeater.DataSource = DAL.GetItems(page, pageSize); this.MyRepeater.DataBind(); int totalItems = DAL.GetTotalNumberOfItems(); this.PaginationLabel.Text = RenderPaginationControl(page, pageSize, totalItems);