小编典典

使用中继器和SQL进行自定义分页

sql

我一直在寻找一个好的教程来教我如何使用简单的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)

但现在我在演示文稿层中停留在如何使用它上!


阅读 206

收藏
2021-03-23

共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

并通过该值 TOTALITEMSRenderPaginationControl

就与Repeater的绑定而言,这很简单:

this.MyRepeater.DataSource = DAL.GetItems(page, pageSize);
this.MyRepeater.DataBind();

int totalItems = DAL.GetTotalNumberOfItems();
this.PaginationLabel.Text = RenderPaginationControl(page, pageSize, totalItems);
2021-03-23