Разбиение по страницам данных отчета в элементе управления DataList или Repeater (VB)

Скотт Митчелл

Загрузить PDF-файл

Хотя ни DataList, ни Repeater не предлагают поддержку автоматического разбиения по страницам или сортировки, в этом руководстве показано, как добавить поддержку разбиения по страницам в DataList или Repeater, что обеспечивает гораздо более гибкие интерфейсы подкачки и отображения данных.

Введение

Разбиение по страницам и сортировка — это две очень распространенные функции при отображении данных в веб-приложении. Например, при поиске ASP.NET книг в онлайн-магазине таких книг могут быть сотни, но в отчете с списком результатов поиска указано только десять совпадений на странице. Кроме того, результаты можно отсортировать по названию, цене, количеству страниц, имени автора и т. д. Как мы говорили в руководстве по разбиению на страницы и сортировке данных отчета , элементы управления GridView, DetailsView и FormView предоставляют встроенную поддержку разбиения на страницы, которую можно включить при флажке. GridView также включает поддержку сортировки.

К сожалению, ни DataList, ни Repeater не поддерживают автоматическое разбиение по страницам или сортировку. В этом руководстве мы рассмотрим, как добавить поддержку разбиения по страницам в DataList или Repeater. Необходимо вручную создать интерфейс разбиения на страницы, отобразить соответствующую страницу записей и запомнить страницу, просматриваемую при обратной отправке. Хотя это занимает больше времени и кода, чем при использовании GridView, DetailsView или FormView, DataList и Repeater обеспечивают гораздо более гибкие интерфейсы подкачки и отображения данных.

Примечание

В этом руководстве основное внимание уделяется исключительно разбиению по страницам. В следующем руководстве мы переключим наше внимание на добавление возможностей сортировки.

Шаг 1. Добавление веб-страниц руководства по разбиению по страницам и сортировке

Прежде чем приступить к работе с этим руководством, давайте добавим ASP.NET страниц, необходимых для этого и следующего руководства. Начните с создания в проекте папки с именем PagingSortingDataListRepeater. Затем добавьте следующие пять страниц ASP.NET в эту папку, чтобы все они были настроены для использования master страницы Site.master:

  • Default.aspx
  • Paging.aspx
  • Sorting.aspx
  • SortingWithDefaultPaging.aspx
  • SortingWithCustomPaging.aspx

Создание папки PagingSortingDataListRepeater и добавление страниц руководства ASP.NET

Рис. 1. Создание PagingSortingDataListRepeater папки и добавление страниц руководства ASP.NET

Затем откройте страницу Default.aspx и перетащите SectionLevelTutorialListing.ascx элемент управления "Пользовательский элемент управления" из UserControls папки в область Конструктор. Этот пользовательский элемент управления, созданный в руководстве по основным страницам и навигации сайта , перечисляет карту сайта и отображает эти руководства в текущем разделе маркированного списка.

Добавьте элемент управления SectionLevelTutorialListing.ascx в Default.aspx

Рис. 2. Добавление пользовательского SectionLevelTutorialListing.ascx элемента управления в Default.aspx (щелкните для просмотра полноразмерного изображения)

Чтобы маркированный список отображал руководства по разбиению по страницам и сортировке, которые мы будем создавать, необходимо добавить их на карту сайта. Web.sitemap Откройте файл и добавьте следующую разметку после исправления и удаления с помощью разметки узла карты сайта DataList:

<siteMapNode
    url="~/PagingSortingDataListRepeater/Default.aspx"
    title="Paging and Sorting with the DataList and Repeater"
    description="Paging and Sorting the Data in the DataList and Repeater Controls">
    <siteMapNode
        url="~/PagingSortingDataListRepeater/Paging.aspx"
        title="Paging"
        description="Learn how to page through the data shown
                     in the DataList and Repeater controls." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/Sorting.aspx"
        title="Sorting"
        description="Sort the data displayed in a DataList or
                     Repeater control." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/SortingWithDefaultPaging.aspx"
        title="Sorting with Default Paging"
        description="Create a DataList or Repeater control that is paged using
                     default paging and can be sorted." />
    <siteMapNode
        url="~/PagingSortingDataListRepeater/SortingWithCustomPaging.aspx"
        title="Sorting with Custom Paging"
        description="Learn how to sort the data displayed in a DataList or
                     Repeater control that uses custom paging." />
</siteMapNode>

Обновление карты сайта для включения новых страниц ASP.NET

Рис. 3. Обновление карты сайта для включения новых страниц ASP.NET

Обзор разбиения по страницам

В предыдущих руководствах мы видели, как просматривать данные в элементах управления GridView, DetailsView и FormView. Эти три элемента управления предлагают простую форму разбиения по страницам, называемую разбиением по умолчанию , которую можно реализовать, просто проверив параметр Включить разбиение по страницам в смарт-теге элемента управления. При разбиении на страницы по умолчанию каждый раз, когда страница данных запрашивается при первом посещении страницы или когда пользователь переходит на другую страницу данных, элемент управления GridView, DetailsView или FormView повторно запрашивает все данные из ObjectDataSource. Затем он выделяет конкретный набор записей для отображения с учетом запрошенного индекса страницы и количества записей, отображаемых на странице. Мы подробно обсудили разбиение на страницы по умолчанию в учебнике По страницам и сортировке данных отчета .

Так как разбиение на страницы по умолчанию повторно запрашивает все записи для каждой страницы, это нецелесообразно при просмотре по страницам достаточно больших объемов данных. Например, представьте себе разбиение по страницам по 50 000 записей с размером страницы 10. Каждый раз, когда пользователь переходит на новую страницу, из базы данных должны быть извлечены все 50 000 записей, даже если отображается только десять из них.

Настраиваемое разбиение на страницы решает проблемы с производительностью разбиения по умолчанию, захватывая только точное подмножество записей для отображения на запрошенной странице. При реализации пользовательского разбиения по страницам необходимо написать SQL-запрос, который будет эффективно возвращать только правильный набор записей. Мы узнали, как создать такой запрос с помощью новых ROW_NUMBER() ключевое слово SQL Server 2005, в учебнике Эффективное разбиение по страницам с помощью больших объемов данных.

Чтобы реализовать разбиение на страницы по умолчанию в элементах управления DataList или Repeater, можно использовать PagedDataSource класс в качестве оболочки для ProductsDataTable , содержимое которой выполняется на страницы. Класс PagedDataSource имеет DataSource свойство, которое можно назначить любому перечисляемому объекту, а PageSize также свойства и CurrentPageIndex , указывающие, сколько записей должно отображаться на странице и текущий индекс страницы. После установки PagedDataSource этих свойств можно использовать в качестве источника данных любого веб-элемента управления данными. При PagedDataSourceперечислении возвращает только соответствующее подмножество записей своей внутренней DataSource среды на PageSize основе свойств и CurrentPageIndex . На рисунке 4 показаны функциональные PagedDataSource возможности класса .

PagedDataSource заключает в оболочку перечисляемый объект с помощью интерфейса, допускающего страницы

Рис. 4. Оболочка PagedDataSource перечисляемого объекта с помощью страничного интерфейса

Объект PagedDataSource можно создать и настроить непосредственно из уровня бизнес-логики и привязать к DataList или Repeater через ObjectDataSource либо создать и настроить непосредственно в классе кода программной части страницы ASP.NET. Если используется последний подход, мы должны не использовать ObjectDataSource и вместо этого привязать выстраиваемые данные к DataList или Repeater программным способом.

Объект PagedDataSource также имеет свойства для поддержки пользовательского разбиения по страницам. Однако мы можем обойти использование для пользовательского PagedDataSource разбиения по страницам, так как у нас уже есть методы BLL в ProductsBLL классе, предназначенном для пользовательского разбиения по страницам, которые возвращают точные записи для отображения.

В этом руководстве мы рассмотрим реализацию разбиения по умолчанию в DataList путем добавления нового метода в ProductsBLL класс , который возвращает правильно настроенный PagedDataSource объект. В следующем руководстве мы посмотрим, как использовать настраиваемое разбиение по страницам.

Шаг 2. Добавление метода разбиения по умолчанию на уровне бизнес-логики

В ProductsBLL настоящее время класс имеет метод для возврата всех сведений о GetProducts() продукте и один для возврата определенного подмножества продуктов по начальнму индексу GetProductsPaged(startRowIndex, maximumRows). При разбиении по страницам по умолчанию элементы управления GridView, DetailsView и FormView используют GetProducts() метод для извлечения всех продуктов, а затем используют внутренний PagedDataSource для отображения только правильного подмножества записей. Чтобы реплицировать эту функцию с помощью элементов управления DataList и Repeater, можно создать новый метод в BLL, который имитирует это поведение.

Добавьте в класс метод с ProductsBLL именем GetProductsAsPagedDataSource , который принимает два целочисленных входных параметра:

  • pageIndex индекс отображаемой страницы с нулем и
  • pageSize количество записей, отображаемых на странице.

GetProductsAsPagedDataSource Начинается с получения всех записей из GetProducts(). Затем он создает PagedDataSource объект , задав его CurrentPageIndex свойствам и PageSize значения переданных pageIndex параметров и pageSize . Метод завершается возвратом заданного значения PagedDataSource:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsAsPagedDataSource(ByVal pageIndex As Integer, _
    ByVal pageSize As Integer) As PagedDataSource
    ' Get ALL of the products
    Dim products As Northwind.ProductsDataTable = GetProducts()
    ' Limit the results through a PagedDataSource
    Dim pagedData As New PagedDataSource()
    pagedData.DataSource = products.Rows
    pagedData.AllowPaging = True
    pagedData.CurrentPageIndex = pageIndex
    pagedData.PageSize = pageSize
    Return pagedData
End Function

Шаг 3. Отображение сведений о продукте в DataList с помощью разбиения по умолчанию

GetProductsAsPagedDataSource После добавления метода в ProductsBLL класс мы можем создать DataList или Repeater, который предоставляет разбиение по страницам по умолчанию. Начните с открытия Paging.aspx страницы в папке PagingSortingDataListRepeater и перетащите DataList из панели элементов на Designer, задав свойству DataList значение IDProductsDefaultPaging. В смарт-теге DataList создайте объект ObjectDataSource с именем ProductsDefaultPagingDataSource и настройте его таким образом, чтобы он извлекал данные с помощью GetProductsAsPagedDataSource метода .

Создайте объект ObjectDataSource и настройте его для использования метода GetProductsAsPagedDataSource ()

Рис. 5. Создание объекта ObjectDataSource и настройка его для использования GetProductsAsPagedDataSource() метода (щелкните для просмотра полноразмерного изображения)

Задайте для раскрывающихся списков на вкладках UPDATE, INSERT и DELETE значение (Нет).

Задайте для Drop-Down Списки на вкладках UPDATE, INSERT и DELETE значение (Нет)

Рис. 6. Задайте для Drop-Down Списки на вкладках UPDATE, INSERT и DELETE значение (Нет) (Щелкните для просмотра полноразмерного изображения)

GetProductsAsPagedDataSource Так как метод ожидает два входных параметра, мастер запрашивает источник этих значений параметров.

Индекс страницы и значения размера страницы должны помнить при обратной отправке. Они могут храниться в состоянии представления, сохраняться в строках запросов, храниться в переменных сеанса или запоминаться с помощью другого метода. В этом руководстве мы будем использовать querystring, которая имеет преимущество, позволяя добавить определенную страницу данных в закладки.

В частности, используйте поля строки запроса pageIndex и pageSize для pageIndex параметров и pageSize соответственно (см. рис. 7). Уделите некоторое время, чтобы задать значения по умолчанию для этих параметров, так как значения строки запроса не будут присутствовать при первом посещении этой страницы пользователем. Для pageIndexзадайте значение по умолчанию 0 (в котором будет отображаться первая страница данных), а pageSize значение по умолчанию — 4.

Использование QueryString в качестве источника для параметров pageIndex и pageSize

Рис. 7. Использование QueryString в качестве источника для pageIndex параметров и pageSize (щелкните для просмотра полноразмерного изображения)

После настройки ObjectDataSource Visual Studio автоматически создает ItemTemplate для DataList. Настройте , ItemTemplate чтобы отображались только название продукта, категория и поставщик. Также задайте для свойства DataList RepeatColumns значение 2, его Width значение 100 %, а для свойства ItemStyle s Width — 50 %. Эти параметры ширины обеспечивают равный интервал для двух столбцов.

После внесения этих изменений разметка DataList и ObjectDataSource должна выглядеть примерно так:

<asp:DataList ID="ProductsDefaultPaging" runat="server" Width="100%"
    DataKeyField="ProductID" DataSourceID="ProductsDefaultPagingDataSource"
    RepeatColumns="2" EnableViewState="False">
    <ItemTemplate>
        <h4><asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>'></asp:Label></h4>
        Category:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Eval("CategoryName") %>'></asp:Label><br />
        Supplier:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Eval("SupplierName") %>'></asp:Label><br />
        <br />
        <br />
    </ItemTemplate>
    <ItemStyle Width="50%" />
</asp:DataList>
<asp:ObjectDataSource ID="ProductsDefaultPagingDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsAsPagedDataSource">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="0" Name="pageIndex"
             QueryStringField="pageIndex" Type="Int32" />
        <asp:QueryStringParameter DefaultValue="4" Name="pageSize"
             QueryStringField="pageSize" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Примечание

Так как в этом руководстве мы не выполняем никаких функций обновления или удаления, вы можете отключить состояние представления DataList, чтобы уменьшить размер отображаемой страницы.

При первоначальном посещении этой страницы в браузере не предоставляются параметры pageIndex строки запроса и pageSize . Поэтому используются значения по умолчанию 0 и 4. Как показано на рисунке 8, в результате появится список данных, в котором отображаются первые четыре продукта.

Перечислены первые четыре продукта

Рис. 8. Первые четыре продукта перечислены (щелкните для просмотра полноразмерного изображения)

Без интерфейса подкачки в настоящее время нет простых средств для перехода на вторую страницу данных. Мы создадим интерфейс разбиения по страницам на шаге 4. В настоящее время разбиение по страницам можно выполнить только путем непосредственного указания критериев разбиения на страницы в строке запроса. Например, чтобы просмотреть вторую страницу, измените URL-адрес в адресной строке браузера с Paging.aspx на Paging.aspx?pageIndex=2 и нажмите клавишу ВВОД. Это приводит к отображению второй страницы данных (см. рис. 9).

Снимок экрана: разбиение данных по страницам в окне DataList со второй страницей данных.

Рис. 9. Отображается вторая страница данных (щелкните для просмотра полноразмерного изображения)

Шаг 4. Создание интерфейса подкачки

Существует множество различных интерфейсов разбиения по страницам, которые можно реализовать. Элементы управления GridView, DetailsView и FormView предоставляют четыре различных интерфейса на выбор:

  • Далее предыдущие пользователи могут перемещать одну страницу за раз на следующую или предыдущую.
  • Далее, Назад, Первый, Последний помимо кнопок Далее и Назад этот интерфейс включает кнопки First и Last для перехода на самую первую или самую последнюю страницу.
  • Числовой список номеров страниц в интерфейсе разбиения на страницы, что позволяет пользователю быстро перейти к определенной странице.
  • Numeric, First, Last в дополнение к числовым номерам страниц включают кнопки для перехода на самую первую или самую последнюю страницу.

Для DataList и Repeater мы отвечаем за выбор интерфейса разбиения по страницам и его реализацию. Это включает в себя создание необходимых веб-элементов управления на странице и отображение запрошенной страницы при нажатии определенной кнопки интерфейса подкачки. Кроме того, может потребоваться отключить некоторые элементы управления интерфейсом подкачки. Например, при просмотре первой страницы данных с помощью интерфейса Next, Previous, First, Last кнопки First и Previous будут отключены.

В этом руководстве мы будем использовать интерфейс Next, Previous, First, Last. Добавьте на страницу четыре элемента управления Button Web и задайте для их IDFirstPageсвойств значение , PrevPage, NextPageи LastPage. Text Задайте для свойств значения << First, < Prev, Next >и Last >> .

<asp:Button runat="server" ID="FirstPage" Text="<< First" />
<asp:Button runat="server" ID="PrevPage" Text="< Prev" />
<asp:Button runat="server" ID="NextPage" Text="Next >" />
<asp:Button runat="server" ID="LastPage" Text="Last >>" />

Затем создайте Click обработчик событий для каждой из этих кнопок. Через некоторое время мы добавим код, необходимый для отображения запрошенной страницы.

Запоминание общего количества записей, до которых выполняется перелистывание

Независимо от выбранного интерфейса разбиения на страницы, необходимо вычислить и запомнить общее количество записей, через которые выполняется разбиение на страницы. Общее количество строк (в сочетании с размером страницы) определяет, сколько страниц данных выстраиваются на страницы, что определяет, какие элементы управления интерфейсом подкачки добавляются или включены. В создаваемых нами интерфейсах Next, Previous, First, Last счетчик страниц используется двумя способами:

  • Чтобы определить, просматривается ли последняя страница, в этом случае отключены кнопки Далее и Последняя.
  • Если пользователь нажимает кнопку Последний, необходимо взбить его до последней страницы, индекс которой на один меньше, чем количество страниц.

Количество страниц вычисляется как потолок общего количества строк, делимый на размер страницы. Например, если мы просматриваем по страницам 79 записей с четырьмя записями на странице, то количество страниц будет равно 20 (потолок 79 /4). Если мы используем интерфейс числового разбиения на страницы, эти сведения сообщают нам о том, сколько числовых кнопок страницы необходимо отобразить; Если в интерфейсе разбиения по страницам есть кнопки Next или Last, количество страниц используется для определения того, когда следует отключить кнопки Далее или Последний.

Если интерфейс разбиения на страницы содержит кнопку Last, крайне важно, чтобы общее количество записей, которые выстраиваются на страницы, запоминалось между обратными передачами, чтобы при нажатии кнопки Последний можно было определить индекс последней страницы. Чтобы упростить эту задачу, создайте TotalRowCount свойство в классе кода программной части страницы ASP.NET, которое сохраняет свое значение для просмотра состояния:

Private Property TotalRowCount() As Integer
    Get
        Dim o As Object = ViewState("TotalRowCount")
        If (o Is Nothing) Then
            Return -1
        Else
            Return Convert.ToInt32(o)
        End If
    End Get
    set(Value as Integer)
        ViewState("TotalRowCount") = value
    End Set
End Property

В дополнение к TotalRowCount, укажите минуту, чтобы создать доступные только для чтения свойства на уровне страницы, чтобы легко получить доступ к индексу страницы, размеру страницы и количеству страниц:

Private ReadOnly Property PageIndex() As Integer
    Get
        If (Not String.IsNullOrEmpty(Request.QueryString("pageIndex"))) Then
            Return Convert.ToInt32(Request.QueryString("pageIndex"))
        Else
            Return 0
        End If
    End Get
End Property
Private ReadOnly Property PageSize() As Integer
    Get
        If (Not String.IsNullOrEmpty(Request.QueryString("pageSize"))) Then
            Return Convert.ToInt32(Request.QueryString("pageSize"))
        Else
            Return 4
        End If
    End Get
End Property
Private ReadOnly Property PageCount() As Integer
    Get
        If TotalRowCount <= 0 OrElse PageSize <= 0 Then
            Return 1
        Else
            Return ((TotalRowCount + PageSize) - 1) / PageSize
        End If
    End Get
End Property

Определение общего количества записей, до которых выполняется разыка

Объект PagedDataSource , возвращаемый методом ObjectDataSource, Select() содержит все записи продукта, даже если в DataList отображается только их подмножество. Свойство PagedDataSource s Count возвращает только количество элементов, которые будут отображаться в DataList; DataSourceCount свойство возвращает общее количество элементов в .PagedDataSource Поэтому нам нужно присвоить свойству ASP.NET страницы TotalRowCount значение PagedDataSource свойства s DataSourceCount .

Для этого создайте обработчик событий для события ObjectDataSource Selected . В обработчике Selected событий у нас есть доступ к возвращаемого значения метода ObjectDataSource Select() в данном случае — PagedDataSource.

Protected Sub ProductsDefaultPagingDataSource_Selected(ByVal sender As Object, _
    ByVal e As System.Web.UI.WebControls.ObjectDataSourceStatusEventArgs) _
    Handles ProductsDefaultPagingDataSource.Selected
    ' Reference the PagedDataSource bound to the DataList
    Dim pagedData As PagedDataSource = CType(e.ReturnValue, PagedDataSource)
    ' Remember the total number of records being paged through across postbacks
    TotalRowCount = pagedData.DataSourceCount
End Sub

Отображение запрошенной страницы данных

Когда пользователь нажимает одну из кнопок в интерфейсе разбиения по страницам, необходимо отобразить запрошенную страницу данных. Так как параметры разбиения на страницы указываются с помощью строки запроса, для отображения запрошенной страницы данных используйте Response.Redirect(url) , чтобы браузер пользователя повторно запросил Paging.aspx страницу с соответствующими параметрами разбиения на страницы. Например, чтобы отобразить вторую страницу данных, мы перенаправим пользователя в Paging.aspx?pageIndex=1.

Чтобы упростить эту задачу, создайте RedirectUser(sendUserToPageIndex) метод, который перенаправляет пользователя Paging.aspx?pageIndex=sendUserToPageIndexна . Затем вызовите этот метод из четырех обработчиков событий Button Click . В обработчике FirstPageClick событий вызовите RedirectUser(0), чтобы отправить их на первую страницу; в обработчике PrevPageClick событий используйте PageIndex - 1 в качестве индекса страницы и т. д.

Protected Sub FirstPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles FirstPage.Click
    ' Send the user to the first page
    RedirectUser(0)
End Sub
Protected Sub PrevPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles PrevPage.Click
    ' Send the user to the previous page
    RedirectUser(PageIndex - 1)
End Sub
Protected Sub NextPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles NextPage.Click
    ' Send the user to the next page
    RedirectUser(PageIndex + 1)
End Sub
Protected Sub LastPage_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles LastPage.Click
    ' Send the user to the last page
    RedirectUser(PageCount - 1)
End Sub
Private Sub RedirectUser(ByVal sendUserToPageIndex As Integer)
    ' Send the user to the requested page
    Response.Redirect(String.Format("Paging.aspx?pageIndex={0}&pageSize={1}", _
        sendUserToPageIndex, PageSize))
End Sub

Click После завершения обработчиков событий записи DataList можно просматривать по страницам, нажимая кнопки. Увысьте немного, чтобы попробовать его!

Отключение элементов управления интерфейсом подкачки

В настоящее время все четыре кнопки включены независимо от просматриваемой страницы. Однако мы хотим отключить кнопки Первая и Предыдущая при отображении первой страницы данных и кнопки Далее и Последняя при отображении последней страницы. Объект PagedDataSource , возвращаемый методом ObjectDataSource, Select() имеет свойства IsFirstPage , которые IsLastPage можно проверить, чтобы определить, просматриваем ли мы первую или последнюю страницу данных.

Добавьте в обработчик событий ObjectDataSource следующее Selected :

' Configure the paging interface based on the data in the PagedDataSource
FirstPage.Enabled = Not pagedData.IsFirstPage
PrevPage.Enabled = Not pagedData.IsFirstPage
NextPage.Enabled = Not pagedData.IsLastPage
LastPage.Enabled = Not pagedData.IsLastPage

При добавлении кнопки Первая и Предыдущая будут отключены при просмотре первой страницы, а кнопки Далее и Последняя будут отключены при просмотре последней страницы.

Позвольте завершить интерфейс разбиения по страницам, сообщив пользователю, какую страницу он просматривает в настоящее время и сколько всего страниц существует. Добавьте веб-элемент управления Label на страницу и задайте для его ID свойства значение CurrentPageNumber. Задайте его Text свойство в обработчике событий ObjectDataSources Selected таким образом, чтобы оно включает текущую просматриваемую страницу (PageIndex + 1) и общее количество страниц (PageCount).

' Display the current page being viewed...
CurrentPageNumber.Text = String.Format("You are viewing page {0} of {1}...", _
    PageIndex + 1, PageCount)

На рисунке 10 показано Paging.aspx время первого посещения. Так как строка запроса пуста, dataList по умолчанию отображает первые четыре продукта; Кнопки Первый и Предыдущий отключены. При нажатии кнопки Далее отображаются следующие четыре записи (см. рис. 11); Теперь включены кнопки Первый и Предыдущий.

Отображается первая страница данных

Рис. 10. Отображается первая страница данных (щелкните для просмотра полноразмерного изображения)

Снимок экрана: страница 2 разбиения данных по страницам в окне DataList.

Рис. 11. Отображается вторая страница данных (щелкните для просмотра полноразмерного изображения)

Примечание

Интерфейс разбиения на страницы можно дополнительно улучшить, разрешив пользователю указать, сколько страниц следует просмотреть на страницу. Например, в DropDownList можно добавить параметры размера страницы, такие как 5, 10, 25, 50 и Все. При выборе размера страницы пользователя потребуется перенаправить обратно в Paging.aspx?pageIndex=0&pageSize=selectedPageSize. Я оставляю реализацию этого улучшения как упражнение для читателя.

Использование пользовательского разбиения по страницам

DataList просматривает свои данные, используя неэффективный метод разбиения по страницам по умолчанию. При разбиении по страницам достаточно больших объемов данных крайне важно использовать пользовательское разбиение по страницам. Хотя сведения о реализации немного отличаются, концепции реализации пользовательского разбиения по страницам в DataList те же, что и при разбиении по умолчанию. При использовании пользовательского разбиения по страницам ProductBLL используйте метод класса GetProductsPaged (вместо GetProductsAsPagedDataSource). Как описано в руководстве Эффективное разбиение по страницам в больших объемах данных , GetProductsPaged необходимо передать индекс начальной строки и максимальное количество возвращаемых строк. Эти параметры можно поддерживать с помощью строки запроса так же, как pageIndex параметры и pageSize , используемые при разбиении по страницам по умолчанию.

Так как с пользовательским разбиением по страницам нет PagedDataSource , необходимо использовать альтернативные методы для определения общего количества записей, которые выводятся на страницы, а также для отображения первой или последней страницы данных. Метод TotalNumberOfProducts() в ProductsBLL классе возвращает общее количество продуктов, через которые выполняется разыкание. Чтобы определить, просматривается ли первая страница данных, проверьте индекс начальной строки, если он равен нулю, а затем просматривается первая страница. Последняя страница просматривается, если индекс начальной строки и максимальное число возвращаемых строк больше или равно общему количеству записей, которые нужно просмотреть.

В следующем руководстве мы более подробно рассмотрим реализацию пользовательского разбиения по страницам.

Сводка

Хотя ни DataList, ни Repeater не предоставляют поддержку разбиения по страницам в элементах управления GridView, DetailsView и FormView, такие функции можно добавить с минимальными усилиями. Самый простой способ реализовать разбиение по умолчанию — упаковать весь набор продуктов в , PagedDataSource а затем привязать PagedDataSource к DataList или Repeater. В этом руководстве мы добавили GetProductsAsPagedDataSource метод в ProductsBLL класс , чтобы вернуть PagedDataSource. Класс ProductsBLL уже содержит методы, необходимые для пользовательского разбиения по страницам GetProductsPaged и TotalNumberOfProducts.

Наряду с получением точного набора записей, отображаемых для пользовательского разбиения по страницам, или всех записей в PagedDataSource для разбиения по умолчанию, необходимо также вручную добавить интерфейс разбиения по страницам. Для работы с этим руководством мы создали интерфейс Next, Previous, First, Last с четырьмя веб-элементами управления Button. Кроме того, был добавлен элемент управления Метка, отображающий номер текущей страницы и общее количество страниц.

В следующем руководстве мы посмотрим, как добавить поддержку сортировки в DataList и Repeater. Мы также рассмотрим, как создать список данных, который можно как разбиение по страницам, так и сортировать (с примерами с использованием разбиения по умолчанию и настраиваемого разбиения по страницам).

Счастливое программирование!

Об авторе

Скотт Митчелл (Scott Mitchell), автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с Веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часа. Его можно связать по адресу mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.

Отдельная благодарность

Эта серия учебников была проверена многими полезными рецензентами. Ведущими рецензентами этого руководства были Лиз Шулок, Кен Песписа и Бернадетт Ли. Хотите просмотреть предстоящие статьи MSDN? Если да, опустите мне строку на mitchell@4GuysFromRolla.com.