Vous pouvez le faire assez facilement avec un GridView si vous allumez AllowPaging
et réglez le PageSize
à 50. Mais il sera horriblement inefficace - chaque fois que vous passez à une nouvelle page, il va lire tous 1 000 000 lignes, déterminez les 50 qu'il doit afficher et jetez le reste. Ce que vous voulez à la place est un proc stocké dans votre base de données qui prend le numéro de page que vous voulez afficher, élabore l'ensemble des lignes sur cette page et les renvoie à la page ASP.NET. Si vous utilisez SQL Server 2005 ou plus tard, le mieux est d'utiliser une expression de table commune, de sorte que votre proc stocké ressemblera à quelque chose comme ça (ce qui est pour le db 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
Maintenant, retour à ta page. Vous aurez besoin de mettre dans un DataGrid - ils ont un meilleur support pour la pagination personnalisée que toute autre chose - et définir AllowCustomPaging
à True. Vous pourriez trouver plus facile d'avoir une méthode qui appelle votre proc stocké avec le numéro de page, puis vous pouvez ajouter Précédent, Suivant, Premier, Dernier, +10, -10 boutons - ce que vous voulez, il suffit de travailler sur le numéro de page et passer à la méthode.
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
Quelle base de données utilisez-vous? –