65.9K
CodeProject 正在变化。 阅读更多。
Home

使用ROW_NUMBER()分页GridView

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.30/5 (23投票s)

2006年2月5日

Ms-RL

2分钟阅读

viewsIcon

182400

downloadIcon

4628

本文介绍了如何使用SQL Server 2005的ROW_NUMBER()函数在GridView Web控件中实现自定义分页

Sample Image - PagingGridView.jpg

引言

在网上搜索时,我发现了很多关于 SQL Server 2005 新功能的有用文章,其中我提到了 Jason Witty 的文章 - 这是我的起点。 我们期待 SQL Server 2005 的这个新功能已经很久了。我不想将这种新的 ASP .NET 分页与使用 SQL Server 2000 的众所周知的 temporary tableRowCount 方法或 Cursor 方法进行比较,而是想说明以这种方式分页 GridView 并对其进行自定义是多么简单。 我不使用 GridView Web 控件的内置分页机制。

我编写了这个示例,因为我需要为网格视图添加自定义分页,该分页允许轻松更改页面大小并直接转到页码,而无需逐页浏览。 过去,我已经使用这种分页方式处理数据网格。 要将其从数据网格更改为 gridview,我复制粘贴了代码,工作就完成了。 代码隐藏实际上是非常基本的,而且非常容易理解。

代码

Size 按钮的点击事件中,我们设置当前页码和页面大小,然后将 GridView 绑定以显示数据

PageNum = 1;
PageSize = Convert.ToInt16(PageSizeTxt.Text);
BindGridView();
Go 按钮的事件点击中,我们转到某个页码
        if (GoToPageTxt.Text != "")
        {
            int maxPage  = Convert.ToInt32(TotalPages.Text);
            int goToPage = Convert.ToInt32(GoToPageTxt.Text);

            if (goToPage <= maxPage)
            {
                PageNum = goToPage;
                BindGridView();
            }
        }
这是 GridView HTML 代码
<asp:GridView  ID="GridView1" runat="server" AutoGenerateColumns="False" >
       <Columns>
              <asp:BoundField DataField="RowNumber" HeaderText="RowNumber" />
              <asp:BoundField DataField="Name" HeaderText="Name" />
              <asp:BoundField DataField="SalesYTD" HeaderText="SalesYTD" />
              <asp:BoundField DataField="PostalCode" HeaderText="PostalCode" />
       </Columns>               
</asp:GridView>

我使用 SQL Server 2005 联机丛书的示例构建了存储过程。 如你所见,它根据年初至今的销售额返回 AdventureWorks 数据库中销售人员的 ROW_NUMBER。 我的意图不是解释 ROW_NUMBER() 的工作原理,因为这已经在 SQL Server 2005 联机丛书或网络上的许多文章中完成,而是如何将参数传递给存储过程以使用 ROW_NUMBER() 自定义分页。 我只是将 Microsoft 查询包含在我的存储过程中,分页效果很好。 最后,该查询返回记录总数,以计算我们可以显示多少页。 存储过程脚本如下所示

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE PROCEDURE [dbo].[sp_GridView_RowNumber]
(
    @PageNum int,
    @PageSize int,
    @TotalRowsNum int output
)
AS

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Use ROW_NUMBER function
    WITH Salespeople_AdventureWorks As
    (
        SELECT 'RowNumber' = ROW_NUMBER() OVER(ORDER BY SalesYTD DESC), 
               'Name' = c.FirstName + ' ' + c.LastName, s.SalesYTD, a.PostalCode
        FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
        JOIN Person.Address a ON a.AddressID = c.ContactID
        WHERE ((TerritoryID IS NOT NULL) AND (s.SalesYTD <> 0))
    )

    -- Query result
    SELECT * 
    FROM Salespeople_AdventureWorks
    WHERE RowNumber BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize             
    ORDER BY SalesYTD DESC

    -- Returns total records number
    SELECT @TotalRowsNum = count(*) 
    FROM Sales.SalesPerson s JOIN Person.Contact c on s.SalesPersonID = c.ContactID
    JOIN Person.Address a ON a.AddressID = c.ContactID
    WHERE ((TerritoryID IS NOT NULL) AND (s.SalesYTD <> 0))
END
源代码包括 Visual Studio 2005 中的解决方案和存储过程的脚本。 你必须更改代码中的连接字符串才能运行该示例。

© . All rights reserved.