使用ROW_NUMBER()分页GridView
本文介绍了如何使用SQL Server 2005的ROW_NUMBER()函数在GridView Web控件中实现自定义分页
引言
在网上搜索时,我发现了很多关于 SQL Server 2005 新功能的有用文章,其中我提到了 Jason Witty 的文章 - 这是我的起点。 我们期待 SQL Server 2005 的这个新功能已经很久了。我不想将这种新的 ASP .NET 分页与使用 SQL Server 2000 的众所周知的 temporary table
、RowCount
方法或 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 中的解决方案和存储过程的脚本。 你必须更改代码中的连接字符串才能运行该示例。