Поделиться через


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

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

Загрузить 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 PagedDataSource GetProductsAsPagedDataSource(int pageIndex, int pageSize)
{
    // Get ALL of the products
    Northwind.ProductsDataTable products = GetProducts();
    // Limit the results through a PagedDataSource
    PagedDataSource pagedData = new PagedDataSource();
    pagedData.DataSource = products.Rows;
    pagedData.AllowPaging = true;
    pagedData.CurrentPageIndex = pageIndex;
    pagedData.PageSize = pageSize;
    return pagedData;
}

Шаг 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 будут отключены обе кнопки Первая и Предыдущая.

В этом руководстве мы будем использовать интерфейс Next, Previous, First, Last. Добавьте на страницу четыре веб-элемента управления Button и задайте для их ID значений FirstPage, 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, количество страниц используется для определения времени отключения кнопок Next или Last.

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

private int TotalRowCount
{
    get
    {
        object o = ViewState["TotalRowCount"];
        if (o == null)
            return -1;
        else
            return (int)o;
    }
    set
    {
        ViewState["TotalRowCount"] = value;
    }
}

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

private int PageIndex
{
    get
    {
        if (!string.IsNullOrEmpty(Request.QueryString["pageIndex"]))
            return Convert.ToInt32(Request.QueryString["pageIndex"]);
        else
            return 0;
    }
}
private int PageSize
{
    get
    {
        if (!string.IsNullOrEmpty(Request.QueryString["pageSize"]))
            return Convert.ToInt32(Request.QueryString["pageSize"]);
        else
            return 4;
    }
}
private int PageCount
{
    get
    {
        if (TotalRowCount <= 0 || PageSize <= 0)
            return 1;
        else
            return ((TotalRowCount + PageSize) - 1) / PageSize;
    }
}

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

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

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

protected void ProductsDefaultPagingDataSource_Selected
    (object sender, ObjectDataSourceStatusEventArgs e)
{
    // Reference the PagedDataSource bound to the DataList
    PagedDataSource pagedData = (PagedDataSource)e.ReturnValue;
    // Remember the total number of records being paged through
    // across postbacks
    TotalRowCount = pagedData.DataSourceCount;
}

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

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

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

protected void FirstPage_Click(object sender, EventArgs e)
{
    // Send the user to the first page
    RedirectUser(0);
}
protected void PrevPage_Click(object sender, EventArgs e)
{
    // Send the user to the previous page
    RedirectUser(PageIndex - 1);
}
protected void NextPage_Click(object sender, EventArgs e)
{
    // Send the user to the next page
    RedirectUser(PageIndex + 1);
}
protected void LastPage_Click(object sender, EventArgs e)
{
    // Send the user to the last page
    RedirectUser(PageCount - 1);
}
private void RedirectUser(int sendUserToPageIndex)
{
    // Send the user to the requested page
    Response.Redirect(string.Format("Paging.aspx?pageIndex={0}&pageSize={1}",
        sendUserToPageIndex, PageSize));
}

Click После завершения обработчиков событий записи DataList можно выстраивание с помощью кнопок. Попробуй это!

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

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

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

// Configure the paging interface based on the data in the PagedDataSource
FirstPage.Enabled = !pagedData.IsFirstPage;
PrevPage.Enabled = !pagedData.IsFirstPage;
NextPage.Enabled = !pagedData.IsLastPage;
LastPage.Enabled = !pagedData.IsLastPage;

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

Давайте завершим интерфейс разбиения по страницам, сообщив пользователю, какую страницу он просматривает в настоящее время и сколько всего страниц существует. Добавьте веб-элемент управления Label на страницу и задайте для его ID свойства значение CurrentPageNumber. Задайте его Text свойство в обработчике событий ObjectDataSource s 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. Отображается вторая страница данных (щелкните для просмотра полноразмерного изображения)

Примечание

Интерфейс разбиения на страницы можно дополнительно улучшить, разрешив пользователю указать, сколько страниц нужно просмотреть на странице. Например, в Раскрывающийся список можно добавить параметры размера страницы, такие как 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.