Вы можете сделать это довольно легко с GridView, если вы включите AllowPaging
и установите PageSize
на 50. Но это будет ужасно неэффективно - каждый раз, когда вы при переходе на новую страницу он прочитает все 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