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

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

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

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

Введение

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

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

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

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

  • Default.aspx
  • SimplePagingSorting.aspx
  • EfficientPaging.aspx
  • SortParameter.aspx
  • CustomSortingUI.aspx

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

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

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

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

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

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

<siteMapNode title="Paging and Sorting" url="~/PagingAndSorting/Default.aspx"
    description="Samples of Reports that Provide Paging and Sorting Capabilities">
    <siteMapNode url="~/PagingAndSorting/SimplePagingSorting.aspx"
        title="Simple Paging & Sorting Examples"
        description="Examines how to add simple paging and sorting support." />
    <siteMapNode url="~/PagingAndSorting/EfficientPaging.aspx"
        title="Efficiently Paging Through Large Result Sets"
        description="Learn how to efficiently page through large result sets." />
    <siteMapNode url="~/PagingAndSorting/SortParameter.aspx"
        title="Sorting Data at the BLL or DAL"
        description="Illustrates how to perform sorting logic in the Business Logic
        Layer or Data Access Layer." />
    <siteMapNode url="~/PagingAndSorting/CustomSortingUI.aspx"
        title="Customizing the Sorting User Interface"
        description="Learn how to customize and improve the sorting user interface." />
</siteMapNode>

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

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

Шаг 2. Отображение сведений о продукте в GridView

Прежде чем реализовать возможности разбиения по страницам и сортировки, давайте сначала создадим стандартный неотсортируемый, неустранительный GridView, содержащий сведения о продукте. Эту задачу мы уже много раз выполняли в рамках этой серии руководств, поэтому эти действия должны быть знакомы. Начните с открытия SimplePagingSorting.aspx страницы и перетащите элемент управления GridView с панели элементов на Designer, задав для его ID свойства значение Products. Затем создайте объект ObjectDataSource, который использует метод класса GetProducts() ProductsBLL для возврата всех сведений о продукте.

Получение сведений обо всех продуктах с помощью метода GetProducts()

Рис. 4. Получение сведений обо всех продуктах с помощью метода GetProducts()

Так как этот отчет доступен только для чтения, нет необходимости сопоставлять методы ObjectDataSource Insert(), Update()или Delete() с соответствующими ProductsBLL методами. Поэтому в раскрывающемся списке для вкладок UPDATE, INSERT и DELETE выберите (Нет).

Выберите параметр (Нет) в списке Drop-Down на вкладках UPDATE, INSERT и DELETE.

Рис. 5. Выбор параметра (Нет) в списке Drop-Down на вкладках UPDATE, INSERT и DELETE

Далее давайте настроим поля GridView таким образом, чтобы отображались только названия продуктов, поставщиков, категорий, цен и состояний, которые прекращены. Кроме того, вы можете вносить любые изменения в форматирование на уровне полей, такие как изменение HeaderText свойств или форматирование цены в виде валюты. После этих изменений декларативная разметка GridView должна выглядеть примерно так:

<asp:GridView ID="Products" AutoGenerateColumns="False" DataKeyNames="ProductID"
    DataSourceID="ObjectDataSource1" EnableViewState="False" runat="server">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product"
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="Category"
            SortExpression="CategoryName" ReadOnly="True" />
        <asp:BoundField DataField="SupplierName" HeaderText="Supplier"
            SortExpression="SupplierName" ReadOnly="True" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:C}"
            HtmlEncode="False" />
        <asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
            SortExpression="Discontinued" />
    </Columns>
</asp:GridView>

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

Каждый из продуктов указан в списке

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

Шаг 3. Добавление поддержки разбиения по страницам

Перечисление всех продуктов на одном экране может привести к перегрузке информации для пользователя, просматривающего данные. Чтобы сделать результаты более управляемыми, мы можем разделить данные на более мелкие страницы данных и позволить пользователю пошагово просматривать данные по одной странице за раз. Для этого просто проверка флажок Enable Paging (Включить разбиение по страницам) из смарт-тега GridView (при этом свойству GridView s AllowPaging присваивается значение true).

Установите флажок Включить разбиение по страницам, чтобы добавить поддержку разбиения по страницам

Рис. 7. Установите флажок Включить разбиение на страницы, чтобы добавить поддержку разбиения по страницам (щелкните для просмотра полноразмерного изображения)

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

Элементы управления DetailsView и FormView отображают только одну запись на странице. GridView, однако, обращается к своему PageSize свойству , чтобы определить, сколько записей будет отображаться на странице (по умолчанию это свойство имеет значение 10).

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

  • PagerStyle указывает сведения о стиле для интерфейса разбиения по страницам; может указывать такие параметры, как BackColor, ForeColor, CssClass, HorizontalAlignи т. д.

  • PagerSettings содержит набор свойств, которые могут настраивать функциональность интерфейса разбиения на страницы; PageButtonCount указывает максимальное число числовых номеров страниц, отображаемых в интерфейсе разбиения на страницы (значение по умолчанию — 10); Mode свойство указывает, как работает интерфейс разбиения по страницам, и может иметь значение :

    • NextPrevious отображает кнопки Далее и Назад, позволяющие пользователю переходить вперед или назад на одну страницу за раз.
    • NextPreviousFirstLast в дополнение к кнопкам Далее и Назад также включены кнопки First и Last, что позволяет пользователю быстро перейти на первую или последнюю страницу данных.
    • Numeric отображает ряд номеров страниц, позволяя пользователю немедленно перейти на любую страницу
    • NumericFirstLast в дополнение к номерам страниц, включает кнопки First и Last, что позволяет пользователю быстро перейти на первую или последнюю страницу данных; Кнопки "Первый/Последний" отображаются только в том случае, если все числовые номера страниц не помещаются

Кроме того, GridView, DetailsView и FormView предлагают PageIndex свойства и PageCount , которые указывают на текущую страницу и общее количество страниц данных соответственно. Свойство PageIndex индексируется, начиная с 0, что означает, что при просмотре первой страницы данных PageIndex будет равно 0. PageCount, с другой стороны, начинает подсчет с 1, то PageIndex есть ограничен значениями от 0 до PageCount - 1.

Давайте уйдем на минутку, чтобы улучшить внешний вид интерфейса подкачки GridView по умолчанию. В частности, пусть интерфейс разбиения по страницам выравнивается по правому краю со светло-серым фоном. Вместо того чтобы задавать эти свойства напрямую с помощью свойства GridView PagerStyle , давайте создадим класс CSS в с Styles.css именем PagerRowStyle , а затем назначим PagerStyle свойство s CssClass с помощью темы. Начните с открытия Styles.css и добавления следующего определения класса CSS:

.PagerRowStyle
{
    background-color: #ddd;
    text-align: right;
}

Затем откройте GridView.skin файл в папке DataWebControls в папке App_Themes . Как мы говорили в руководстве по эталонным страницам и навигации по сайту , файлы обложки можно использовать для указания значений свойств по умолчанию для веб-элемента управления. Таким образом, дополнить существующие параметры, включив в свойство s CssClass значение PagerStylePagerRowStyle. Кроме того, давайте настроим интерфейс разбиения на страницы для отображения не более пяти числовых кнопок страницы с помощью интерфейса разбиения по страницам NumericFirstLast .

<asp:GridView runat="server" CssClass="DataWebControlStyle">
   <AlternatingRowStyle CssClass="AlternatingRowStyle" />
   <RowStyle CssClass="RowStyle" />
   <HeaderStyle CssClass="HeaderStyle" />
   <FooterStyle CssClass="FooterStyle" />
   <SelectedRowStyle CssClass="SelectedRowStyle" />
   <PagerStyle CssClass="PagerRowStyle" />
   <PagerSettings Mode="NumericFirstLast" PageButtonCount="5" />
</asp:GridView>

Взаимодействие пользователя с разбиением по страницам

На рисунке 8 показана веб-страница при посещении в браузере после того, как установлен флажок Включить разбиение по страницам GridView и PagerStyle выполнены конфигурации и PagerSettings с помощью GridView.skin файла. Обратите внимание, что отображаются только десять записей, а интерфейс разбиения на страницы указывает, что мы просматриваем первую страницу данных.

Если включено разбиение по страницам, одновременно отображается только подмножество записей

Рис. 8. Если включено разбиение по страницам, одновременно отображается только подмножество записей (щелкните для просмотра полноразмерного изображения)

Когда пользователь щелкает один из номеров страниц в интерфейсе разбиения на страницы, происходит обратная связь и страница перезагружается с отображением записей запрошенной страницы. На рисунке 9 показаны результаты после просмотра последней страницы данных. Обратите внимание, что последняя страница содержит только одну запись. Это связано с тем, что в общей сложности 81 запись, в результате чего восемь страниц по 10 записей на странице плюс одна страница с одинокой записью.

Нажатие кнопки

Рис. 9. Нажатие кнопки "По номеру страницы" приводит к обратной отправке и отображает соответствующее подмножество записей (щелкните для просмотра полноразмерного изображения)

Рабочий процесс Server-Side разбиения по страницам

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

  1. Срабатывает событие GridView (или DetailsView или FormView) PageIndexChanging
  2. ObjectDataSource повторно запрашивает все данные из BLL; Значения свойств GridView PageIndex и PageSize используются для определения записей, возвращаемых из BLL, должны отображаться в GridView.
  3. Срабатывает событие GridView PageIndexChanged

На шаге 2 объект ObjectDataSource повторно запрашивает все данные из своего источника данных. Этот стиль разбиения на страницы обычно называется разбиением по умолчанию, так как это поведение разбиения на страницы, используемое по умолчанию при задании свойству AllowPaging значения true. При разбиении на страницы по умолчанию веб-элемент управления данными наивно извлекает все записи для каждой страницы данных, несмотря на то, что в HTML-коде, отправляемом в браузер, фактически отображается только подмножество записей. Если данные базы данных не кэшируются BLL или ObjectDataSource, разбиение на страницы по умолчанию невозможно для достаточно больших результирующих наборов или веб-приложений с большим количеством одновременных пользователей.

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

Примечание

Хотя разбиение на страницы по умолчанию не подходит при разбиении по достаточно большим результирующим наборам или для сайтов с большим количеством одновременных пользователей, следует понимать, что пользовательское разбиение на страницы требует дополнительных изменений и усилий для реализации и не так просто, как установка флажка (как и разбиение по умолчанию). Таким образом, разбиение по умолчанию может быть идеальным выбором для небольших веб-сайтов с низким уровнем трафика или при разбиении по страницам относительно небольших результирующих наборов, так как его гораздо проще и быстрее реализовать.

Например, если мы знаем, что в базе данных никогда не будет более 100 продуктов, минимальное повышение производительности, получаемого от пользовательского разбиения по страницам, скорее всего, будет компенсировано усилиями, необходимыми для его реализации. Однако если в один прекрасный день у нас могут быть тысячи или десятки тысяч продуктов, то не реализация пользовательского разбиения на страницы значительно затруднила бы масштабируемость нашего приложения.

Шаг 4. Настройка интерфейса разбиения по страницам

Веб-элементы управления данными предоставляют ряд свойств, которые можно использовать для улучшения взаимодействия пользователя с разбиением по страницам. Свойство PageCount , например, указывает общее количество страниц, а PageIndex свойство указывает текущую страницу и может быть настроено для быстрого перемещения пользователя на определенную страницу. Чтобы проиллюстрировать использование этих свойств для улучшения взаимодействия пользователя с разбиением на страницы, давайте добавим на страницу элемент управления Label Web, который сообщает пользователю, какую страницу он в настоящее время посещает, а также элемент управления DropDownList, который позволяет быстро перейти на любую заданную страницу.

Сначала добавьте веб-элемент управления Label на страницу, задайте для его ID свойства PagingInformationзначение и очистите его Text свойство. Затем создайте обработчик событий для события GridView DataBound и добавьте следующий код:

Protected Sub Products_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) _
    Handles Products.DataBound
    PagingInformation.Text = String.Format("You are viewing page {0} of {1}...", _
        Products.PageIndex + 1, Products.PageCount)
End Sub

Этот обработчик событий назначает PagingInformation свойство Label для Text сообщения, информирующего пользователя о просмотре Products.PageIndex + 1 страницы из общего количества страниц Products.PageCount (мы добавляем 1 к свойству Products.PageIndex , так как PageIndex индексируется, начиная с 0). Я выбрал свойство assign this Labels Text в DataBound обработчике событий, а не PageIndexChanged обработчик событий, так как DataBound событие срабатывает каждый раз, когда данные привязаны к GridView, а PageIndexChanged обработчик событий срабатывает только при изменении индекса страницы. Когда gridView изначально привязан к данным при первом посещении страницы, PageIndexChanging событие не срабатывает (в то время как DataBound это происходит).

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

Отображается текущий номер страницы и общее количество страниц

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

В дополнение к элементу управления Метка также добавим элемент управления DropDownList, который перечисляет номера страниц в GridView с выбранной текущей просматриваемой страницей. Идея заключается в том, что пользователь может быстро перейти с текущей страницы на другую, просто выбрав новый индекс страницы из Раскрывающегося списка. Сначала добавьте DropDownList в Designer, задав для его ID свойства значение PageList и проверив параметр Enable AutoPostBack из смарт-тега.

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

' Clear out all of the items in the DropDownList
PageList.Items.Clear()
' Add a ListItem for each page
For i As Integer = 0 To Products.PageCount - 1
    ' Add the new ListItem
    Dim pageListItem As New ListItem(String.Concat("Page ", i + 1), i.ToString())
    PageList.Items.Add(pageListItem)
    ' select the current item, if needed
    If i = Products.PageIndex Then
        pageListItem.Selected = True
    End If
Next

Этот код начинается с очистки элементов в Раскрывающемся списке PageList . Это может показаться лишним, так как количество страниц не изменится, но другие пользователи могут одновременно использовать систему, добавляя или удаляя записи из Products таблицы. Такие вставки или удаления могут изменить количество страниц данных.

Затем нужно снова создать номера страниц и выбрать тот, который соответствует текущему элементу GridView PageIndex , выбранному по умолчанию. Мы делаем это с помощью цикла от 0 до PageCount - 1, добавляя новый ListItem в каждой итерации и устанавливая для его Selected свойства значение true, если текущий индекс итерации равен свойству GridView PageIndex .

Наконец, нам нужно создать обработчик событий для события DropDownList SelectedIndexChanged , которое срабатывает каждый раз, когда пользователь выбирает другой элемент из списка. Чтобы создать этот обработчик событий, просто дважды щелкните раскрывающийся список в Designer, а затем добавьте следующий код:

Protected Sub PageList_SelectedIndexChanged(sender As Object, e As System.EventArgs) _
    Handles PageList.SelectedIndexChanged
        ' Jump to the specified page
        Products.PageIndex = Convert.ToInt32(PageList.SelectedValue)
End Sub

Как показано на рисунке 11, простое изменение свойства GridView PageIndex приводит к тому, что данные будут восстановлены в GridView. В обработчике событий GridView DataBound выбран соответствующий dropDownList ListItem .

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

Рис. 11. Пользователь автоматически переходит на шестую страницу при выборе элемента списка "Страница 6" Drop-Down (щелкните для просмотра полноразмерного изображения)

Шаг 5. Добавление поддержки сортировки Bi-Directional

Добавить поддержку двунаправленной сортировки так же просто, как добавить поддержку разбиения по страницам, просто проверка параметр Включить сортировку из смарт-тега GridView (который задает для свойства GridView значениеAllowSorting ).true При этом каждый из заголовков полей GridView отображается как LinkButtons, который при щелчке вызывает обратную передачу и возвращает данные, отсортированные по столбцу в порядке возрастания. При повторном нажатии на тот же заголовок LinkButton данные повторно сортируются в порядке убывания.

Примечание

Если вы используете пользовательский уровень доступа к данным, а не типизированный набор данных, возможно, у вас нет параметра Включить сортировку в смарт-теге GridView. Этот флажок доступен только для gridView, привязанных к источникам данных, которые изначально поддерживают сортировку. Typed DataSet обеспечивает поддержку встроенной сортировки, так как ADO.NET DataTable предоставляет Sort метод, который при вызове сортирует DataTable DataRows с использованием указанных условий.

Если DAL не возвращает объекты, которые изначально поддерживают сортировку, необходимо настроить ObjectDataSource для передачи сведений о сортировке на уровень бизнес-логики, который может сортировать данные или сортировать данные по DAL. В будущем мы рассмотрим, как сортировать данные на уровнях бизнес-логики и доступа к данным.

Элементы сортировки LinkButton отрисовываются в виде гиперссылок HTML, текущие цвета которых (синий для ссылки без просмотра и темно-красный для посещенной ссылки) конфликтуют с цветом фона строки заголовка. Вместо этого пусть все ссылки на строки заголовков отображаются белым цветом, независимо от того, были ли они посещены или нет. Это можно сделать, добавив в класс следующее Styles.css :

.HeaderStyle a, .HeaderStyle a:visited
{
    color: White;
}

Этот синтаксис указывает на использование белого текста при отображении этих гиперссылок в элементе, использующего класс HeaderStyle.

После этого добавления CSS при посещении страницы в браузере ваш экран должен выглядеть примерно так, как на рис. 12. В частности, на рис. 12 показаны результаты после нажатия ссылки на заголовок поля Price.

Снимок экрана: учебники по работе с данными на странице

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

Изучение рабочего процесса сортировки

Все поля GridView BoundField, CheckBoxField, TemplateField и т. д. имеют SortExpression свойство , указывающее выражение, которое следует использовать для сортировки данных при щелчке ссылки на заголовок сортировки этого поля. GridView также имеет SortExpression свойство . При щелчке заголовка сортировки LinkButton GridView присваивает значение этого поля SortExpression свойству SortExpression . Затем данные повторно извлекаются из ObjectDataSource и сортируются в соответствии со свойством GridView.SortExpression В следующем списке подробно описана последовательность шагов, которая выполняется, когда пользователь сортирует данные в GridView:

  1. Срабатывает событие сортировки GridView
  2. Свойству GridView SortExpression задано значение SortExpression поля, для которого был щелкнун заголовок сортировки LinkButton.
  3. ObjectDataSource повторно извлекает все данные из BLL, а затем сортирует их с помощью GridView. SortExpression
  4. Свойство GridView сбрасывается PageIndex до 0, что означает, что при сортировке пользователь возвращается на первую страницу данных (при условии, что реализована поддержка разбиения по страницам).
  5. Срабатывает событие GridView Sorted

Как и при разбиении по страницам по умолчанию, параметр сортировки по умолчанию повторно извлекает все записи из BLL. При использовании сортировки без разбиения по страницам или при использовании сортировки по умолчанию для разбиения по страницам нет способа обойти это снижение производительности (за исключением кэширования данных базы данных). Однако, как мы увидим в следующем руководстве, можно эффективно сортировать данные при использовании пользовательского разбиения по страницам.

При привязке ObjectDataSource к GridView с помощью раскрывающегося списка в смарт-теге GridView каждому полю GridView автоматически присваивается свойство SortExpression имени поля данных в ProductsRow классе . Например, для ProductName параметра BoundField SortExpression задано значение ProductName, как показано в следующей декларативной разметке:

<asp:BoundField DataField="ProductName" HeaderText="Product"
    SortExpression="ProductName" />

Поле можно настроить таким образом, чтобы его нельзя было сортировать, очисв его SortExpression свойство (присвоив его пустой строке). Чтобы проиллюстрировать это, представьте, что мы не хотим, чтобы наши клиенты сортируют наши продукты по цене. Свойство UnitPrice BoundField SortExpression можно удалить из декларативной разметки или через диалоговое окно Поля (которое можно открыть, щелкнув ссылку Изменить столбцы в смарт-теге GridView).

Снимок экрана: окно

Рис. 13. Результаты были отсортированы по значению UnitPrice в порядке возрастания

SortExpression После удаления свойства для UnitPrice BoundField заголовок отображается как текст, а не как ссылка, что предотвращает сортировку данных по цене.

Удалив свойство SortExpression, пользователи больше не смогут сортировать продукты по цене

Рис. 14. Удаление свойства SortExpression позволяет пользователям больше не сортировать товары по цене (щелкните, чтобы просмотреть полноразмерное изображение)

Программная сортировка GridView

Вы также можете отсортировать содержимое GridView программным способом с помощью метода GridViewSort. Просто передайте значение для сортировки SortExpression вместе с SortDirection (Ascending или Descending), и данные GridView будут повторно отсортированы.

Представьте, что мы отключили сортировку UnitPrice по , потому что мы были обеспокоены тем, что наши клиенты будут просто покупать только самые дешевые продукты. Тем не менее, мы хотим, чтобы они покупали самые дорогие продукты, поэтому мы хотели бы, чтобы они могли сортировать продукты по цене, но только от самой дорогой цены до минимума.

Для этого добавьте веб-элемент управления Button на страницу, задайте для его ID свойства SortPriceDescendingзначение , а для свойства Text — значение Сортировать по цене. Затем создайте обработчик событий для события ButtonClick, дважды щелкнув элемент управления Кнопка в Designer. Добавьте следующий код в этот обработчик событий:

Protected Sub SortPriceDescending_Click(sender As Object, e As System.EventArgs) _
    Handles SortPriceDescending.Click
        'Sort by UnitPrice in descending order
        Products.Sort("UnitPrice", SortDirection.Descending)
End Sub

Нажатие этой кнопки возвращает пользователя на первую страницу с продуктами, отсортированные по цене, от самых дорогих до наименее дорогих (см. рис. 15).

Нажатие кнопки Заказ продуктов от самых дорогих к наименьшим

Рис. 15. Нажатие кнопки Заказ продуктов от самых дорогих к наименьшим (щелкните для просмотра полноразмерного изображения)

Сводка

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

  1. После этого возникает обратная связь
  2. Срабатывает событие предварительного уровня веб-элемента управления данными (PageIndexChanging или Sorting)
  3. Объект ObjectDataSource повторно извлекает все данные.
  4. Событие постуровневого веб-элемента управления данными (PageIndexChanged или Sorted)

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

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

Об авторе

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