【问题标题】:Customized Paging With Repeater And SQL使用中继器和 SQL 自定义分页
【发布时间】:2011-06-02 12:03:11
【问题描述】:

我一直在寻找一个很好的教程来教我如何使用简单的 DataBound 控件(如 Repeater)制作自定义分页控件,以实现高性能分页功能。

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

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

我一直在尝试在N-Layered Web Applications with ASP.NET 3.5 Part 4: Sorting, Paging and Filtering (The Database Paging Section and ignore the rest) 上实现示例。到目前为止,我已经在我的 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)

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

【问题讨论】:

  • 查看您的上一个示例,您在实施它时遇到了哪些问题?它需要一个带有 id、startindex 和 pagesize 的方法。
  • 在中继器中分页是我在过去 4 份工作中必须教给人们的东西,没有关于使用中继器的好文章,我想我会把它作为我的下一篇博客文章.
  • @gbs- 让我浏览页面的中继器是我的问题。确切地说,我不知道应该为 startIndex 参数分配什么值以及如何分配!
  • 菲尔-那太好了!我希望它会很快完成,完成后请与我们分享。
  • @lKashef - 我要到 2 月初才能完成,项目的截止日期是 2 月 1 日。完成后将在此处使用链接发表评论。

标签: c# asp.net sql performance optimization


【解决方案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

并将该值传递给 RenderPaginationControl 中的 totalItems。

就与中继器的绑定而言 - 它非常简单:

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

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

【讨论】:

  • @niaher- GetItems 方法的代码中有一个小错误。它没有使用参数来保存 startPageIndex ...我不知道如何让您清楚,但缺少的是一个变量,它将成为我的 sql 查询的新偏移量(@startIndex)以选择一个新部分另一个给定页面的项目数
  • @niaher- 我通过在 url 中添加一个“start”QueryString 参数并在方法中添加一个变量“startIndex”并通过 pageSize (startIndex += pageSize) 增加它来解决它...但我想知道 (StringBuilder+Label) 作为分页导航器是否比中继器更好。最后一个问题!我想使用 Ajax 而 Anchors 不允许我这样做,所以我需要使用服务器控件而不是 LinkBut​​ton 来导致回发并让我的 Ajax 工作!有什么想法吗?...标记为答案顺便说一句,谢谢=D
  • 我真的不明白为什么您需要 GetItems 方法中的“startIndex”参数。您已经知道每个链接内“page”参数的任何未来请求都需要哪个页面,例如- data.aspx?page=2.
  • 至于使用 AJAX - 我不确定,但您可以尝试拥有一个 并向其添加控件,例如- MyPlaceHolder.Controls.Add(new LinkBut​​ton(???)).
  • @niaher- "WHERE (RowNumber BETWEEN (@startIndex) AND @startIndex + @pageSize - 1)" 查询需要知道给定页面将从哪里开始。例如,如果页面大小为 4,则第 1 页开始为 1,第 2 页开始为 5,第 3 页开始为 9,以此类推
猜你喜欢
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多