Man könnte dies mit einem Gridview ganz einfach tun, wenn Sie auf AllowPaging
wechseln und die PageSize
bis 50. Aber stellte es schrecklich ineffizient sein wird - jedes Mal, wenn Sie auf eine neue Seite bewegen werde alles 1 lesen 000 000 Reihen, erarbeiten, welche 50 es anzeigen muss, und den Rest wegwerfen.
Was Sie stattdessen möchten, ist eine gespeicherte Prozedur in Ihrer Datenbank, die die anzuzeigende Seitennummer übernimmt, die Reihe der Zeilen auf dieser Seite berechnet und sie an die ASP.NET-Seite zurückgibt. Wenn Sie SQL Server 2005 oder höher verwenden Ihre beste Wette ist eine Common Table Expression zu verwenden, so wird Ihre gespeicherte Prozedur wie folgt aussehen (dies ist für die Northwind db):
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
Nun zurück zu deine Seite. Sie müssen ein DataGrid einfügen - sie haben bessere Unterstützung für benutzerdefiniertes Paging als alles andere - und setzen AllowCustomPaging
auf True. Sie können es einfacher finden, eine Methode zu verwenden, die Ihren gespeicherten Prozess mit der Seitennummer aufruft. Dann können Sie die Schaltflächen Zurück, Weiter, Erstes, Letztes, +10, -10 hinzufügen - was immer Sie wollen, einfach die Seitennummer ermitteln und weitergeben es zur Methode.
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
Welche Datenbank verwenden Sie? –