嗨,我有一张包含100000行数据的表格。现在我想以页面大小为50的用户形式呈现我的数据。
呈现它的最佳方法是什么。我应该担心datalist吗?或者,当我按下一个按钮时,我可以实现自己的选择查询以获得50条记录吗?
提前致谢
答案 0 :(得分:4)
如果您打开AllowPaging
并将PageSize
设置为50,则可以使用GridView轻松完成此操作。但它将可怕效率低下 - 每次移动到新页面时,它都将读取所有1 000 000行,计算出需要显示的50行,并将其余部分丢弃。
您想要的是数据库中的存储过程,该过程获取您要显示的页码,计算该页面上的行集并将它们返回到ASP.NET页面。如果您正在使用SQL Server 2005或更高版本,最好的办法是使用公用表表达式,因此您的存储过程将看起来像这样(这是针对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。您可能会发现使用一个方法用页码调用存储过程更容易,然后您可以添加上一个,下一个,第一个,最后一个,+ 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
答案 1 :(得分:2)
我为asp.net创建了一个分页控件。这是一个基本的控制,但它可能会帮助你。 Basic Pager Control
答案 2 :(得分:1)
对于100000,将数据库中的所有记录都放入数据集然后对其进行分页将非常耗时。相反,我会在数据库存储过程/查询中实现分页。这样一次只能在前端代码中检索50条记录,用户响应会更快。
答案 3 :(得分:0)
“ListView”和“DataPager”怎么样?
答案 4 :(得分:0)
我会使用pagedDataSource然后你可以绑定到转发器,datalist或其他任何东西。
有例子here。