c# - 在asp.net中分页

原文 标签 c# asp.net paging

嗨,我有一个表有100000行数据。现在我要以页面大小为50的用户形式显示数据。

呈现它的最佳方法是什么。我应该提供数据列表吗?还是我可以实现自己的选择查询,每次按next按钮时每次获取50条记录?

提前致谢

最佳答案

如果打开AllowPaging并将PageSize设置为50,则可以使用GridView轻松地完成此操作。但这效率极低-每次移至新页面时,它将读取所有1000000行,找出需要显示的50个,然后将其余的扔掉。

相反,您想要的是数据库中存储的proc,该proc带有您要显示的页码,计算出该页上的行集,并将它们返回到ASP.NET页。如果您使用的是SQL Server 2005或更高版本,则最好的选择是使用通用表表达式,因此您存储的proc看起来将如下所示(这适用于Northwind数据库):

CREATE PROC [dbo].[PagedOrderList]
@PageNumber INTEGER
AS
SET NOCOUNT ON

DECLARE @lowerRecordNumber INTEGER  
DECLARE @upperRecordNumber INTEGER

-- Work out the record numbers that bound the page
SET @lowerRecordNumber = ((@pageNumber - 1) * 50) + 1
SET @upperRecordNumber = (@pageNumber * 50);

-- Create a CTE with all the records numbered
WITH OrdersCTE ([RowNumber],[OrderId],[OrderDate],[RequiredDate],[ShippedDate],  
[CompanyName],[Value])
AS
(
    SELECT
    ROW_NUMBER() OVER(ORDER BY o.[OrderId]),
    o.OrderID,
    o.OrderDate,
    o.RequiredDate,
    o.ShippedDate,
    c.CompanyName,
    SUM(od.Quantity * od.UnitPrice) AS [Value]
    FROM
    Orders o INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
    INNER JOIN Customers c ON o.CustomerID = c.CustomerID
    GROUP BY o.OrderID, o.OrderDate, o.RequiredDate, o.ShippedDate, c.CompanyName
)
-- Select the rows from the CTE that fall between the bounds we worked out
SELECT * 
FROM OrdersCTE
WHERE [RowNumber] BETWEEN @lowerRecordNumber AND @upperRecordNumber 


现在,返回您的页面。您需要放入一个DataGrid-它们对自定义分页的支持比其他任何方式都更好-并将AllowCustomPaging设置为True。您可能会发现使用一种用页码调用存储的proc的方法会更容易,然后您可以添加上一页,下一页,第一页,最后一页,+ 10,-10按钮-无论您想要什么,只需计算出页码并通过它的方法。

 Private Sub loadData(ByVal pageNumber As Integer)

    Dim orderDataTable As DataTable
    'This uses the Microsoft Enterprise Library for data access
    Dim DAL As Database
    Dim cmd As DbCommand

    DAL = DatabaseFactory.CreateDatabase("Northwind")

    cmd = DAL.GetStoredProcCommand("PagedOrderList")

    'Pass the page number to the stored proc
    DAL.AddInParameter(cmd, "@pageNumber", DbType.Int32, pageNumber)

    'Get a DataTable back with the 50 rows we want
    orderDataTable = DAL.ExecuteDataSet(cmd).Tables(0)

    'Bind the data to the grid
    With OrderDataGrid
        .DataSource = orderDataTable
        .DataBind()
        'Set the page number so we know where we are in the dataset
        .CurrentPageIndex = pageNumber
    End With

End Sub


Private Sub PreviousButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles PreviousButton.Click

    If OrderDataGrid.CurrentPageIndex = 0 Then
        'Make sure we don't try to load a negative page number
    Else
        'Work out the previous page number and load the data for it
        Call loadData(OrderDataGrid.CurrentPageIndex - 1)
    End If

End Sub

Private Sub NextButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NextButton.Click

    'Work out the nextpage number and load the data for it
    Call loadData(OrderDataGrid.CurrentPageIndex + 1)

End Sub

关于c# - 在asp.net中分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1226646/

相关文章:

python - 这是你分页的方式,还是有更好的算法?

c# - 如何使用按钮启用/禁用文本框

c# - 扩展用户控件,如果在ascx页上声明,则内部控件未初始化

asp.net - devexpress aspxgridview - 用于分页的自定义文本

javascript - 如何轻松地从MVC中的复选框附加数据?

c - 在C中分配大 block 内存时避免分页?

c# - asp.net gridview中的分页和排序问题

c# - 使用 .NET 技术录制屏幕视频

c# - 我可以从应用程序内部获取 ClickOnce 发布的产品名称吗?

c# - 检测对象的类型是否为 .NET Framework 定义的类型