Пейджинг в asp.net - PullRequest
       19

Пейджинг в asp.net

2 голосов
/ 04 августа 2009

Привет, у меня есть таблица с 100000 строк данных. Теперь я хочу представить свои данные в форме пользователя с размером страницы 50.

Каков наилучший подход к презентации. Должен ли я предпочесть Datalist? или я могу реализовать свой собственный запрос выбора для получения 50 записей каждый раз, когда я нажимаю кнопку "Далее"?

Заранее спасибо

Ответы [ 5 ]

4 голосов
/ 04 августа 2009

Вы можете сделать это довольно легко с 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
2 голосов
/ 04 августа 2009

Я создал пейджинговый элемент управления для asp.net. Это базовый контроль, но он может помочь вам. Базовое управление пейджером

1 голос
/ 04 августа 2009

Для 100000 потребуется очень много времени, чтобы собрать все записи из базы данных в наборе данных, а затем разместить их на странице. Вместо этого я бы пошел с реализации подкачки в базе данных хранимой процедуры / запроса. Таким образом, только 50 записей будут извлечены в коде внешнего интерфейса одновременно, и пользовательский ответ будет быстрее.

0 голосов
/ 04 августа 2009

Я бы использовал pagedDataSource, чтобы вы могли связываться с ретранслятором, списком данных или чем-то еще.

есть и пример здесь .

0 голосов
/ 04 августа 2009

как насчет "ListView" и "DataPager"?

...