Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Разбиение на страницы и сортировка являются двумя очень распространенными функциями при отображении данных в онлайн-приложении. В этом руководстве мы рассмотрим первый взгляд на добавление сортировки и разбиения по страницам в отчеты, которые мы будем использовать в будущих руководствах.
Введение
Разбиение на страницы и сортировка являются двумя очень распространенными функциями при отображении данных в онлайн-приложении. Например, при поиске книг по ASP.NET в онлайн-магазине может быть сотня таких книг, но в отчете содержатся результаты поиска, показывающие лишь десять совпадений на каждой странице. Кроме того, результаты можно сортировать по названию, цене, количеству страниц, имени автора и т. д. Хотя последние 23 руководства изучили, как создавать различные отчеты, включая интерфейсы, которые позволяют добавлять, редактировать и удалять данные, мы не рассмотрели, как сортировать данные и только примеры разбиения страниц, которые мы видели, были с элементами управления DetailsView и FormView.
В этом руководстве мы посмотрим, как добавить сортировку и разбиение на страницы в отчеты, которые можно выполнить, просто проверив несколько флажков. К сожалению, эта упрощенная реализация имеет свои недостатки, интерфейс сортировки оставляет желать лучшего, и подпрограммы навигации по страницам не предназначены для эффективного разбиения больших результирующих наборов. Будущие учебники помогут изучить, как преодолеть ограничения встроенных решений для разбиения по страницам и сортировки.
Шаг 1. Добавление веб-страниц учебника по пагинации и сортировке
Прежде чем приступить к работе с этим руководством, давайте сначала добавим страницы ASP.NET, необходимые для этого руководства и следующих трех. Начните с создания новой папки в проекте с именем PagingAndSorting
. Затем добавьте в эту папку следующие пять ASP.NET страниц, настроив их для использования главной страницы Site.master
:
Default.aspx
SimplePagingSorting.aspx
EfficientPaging.aspx
SortParameter.aspx
CustomSortingUI.aspx
Рис. 1. Создание папки PagingAndSorting и добавление страниц руководства ASP.NET
Затем откройте Default.aspx
страницу и перетащите SectionLevelTutorialListing.ascx
элемент управления пользователем из UserControls
папки на поверхность проекта. Этот элемент управления пользователем, созданный в руководстве по эталонным страницам и навигации сайта, перечисляет карту сайта и отображает эти учебники в текущем разделе в маркированном списке.
Рис. 2. Добавьте элемент управления User Control 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>
Рис. 3. Обновление карты сайта для включения новых страниц ASP.NET
Шаг 2. Отображение сведений о продукте в GridView
Прежде чем реализовать возможности разбиения на страницы и сортировки, сначала создадим стандартный неотсортируемый, нестраничный GridView, который содержит сведения о продукте. Это задача, которую мы выполняли много раз в течение этого цикла уроков, поэтому эти шаги должны быть вам знакомы. Начните с открытия SimplePagingSorting.aspx
страницы и перетащите элемент управления GridView из панели элементов в конструктор, присвойте его свойству ID
значение Products
. Затем создайте объект ObjectDataSource, использующий метод класса GetProducts()
ProductsBLL для возврата всех сведений о продукте.
Рис. 4. Получение сведений обо всех продуктах с помощью метода GetProducts()
Так как этот отчет является отчетом только для чтения, нет необходимости сопоставлять методы ObjectDataSource Insert()
, Update()
, или Delete()
, с соответствующими ProductsBLL
методами. Поэтому выберите «Нет» в раскрывающемся списке для вкладок UPDATE, INSERT и DELETE.
Рис. 5. Выберите параметр (Нет) в списке Drop-Down на вкладках UPDATE, INSERT и DELETE
Затем давайте настроим поля GridView таким образом, чтобы отображались только имена продуктов, поставщики, категории, цены и прекращенные состояния. Кроме того, вы можете вносить любые изменения форматирования на уровне поля, например настройку свойств HeaderText
или форматирование цены в формате валюты. После этих изменений декларативная разметка GridView должна выглядеть следующим образом:
<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ObjectDataSource1"
EnableViewState="False">
<Columns>
<asp:BoundField DataField="ProductName" HeaderText="Product"
SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="Supplier"
ReadOnly="True" SortExpression="SupplierName" />
<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. Добавление поддержки разбиения по страницам
Перечисление всех продуктов на одном экране может привести к перегрузке информации для пользователя, просматривающего данные. Чтобы сделать результаты более управляемыми, мы можем разбить данные на небольшие страницы данных и позволить пользователю проходить по одной странице за раз. Чтобы сделать это, просто установите флажок "Включить разбиение по страницам" из смарт-тега GridView (это задает для свойства GridView 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
Помимо кнопок "Далее" и "Назад" также включены кнопки "Первый" и "Последний", что позволяет пользователю быстро перейти на первую или последнюю страницу данных. -
Numeric
отображает ряд номеров страниц, позволяя пользователю немедленно переходить на любую страницу. -
NumericFirstLast
помимо номеров страниц, включает кнопки "Первая" и "Последняя" для быстрого перехода на первую или последнюю страницу данных; Кнопки "Первая" и "Последняя" отображаются только в том случае, если все числовые номера страниц не умещаются.
-
Кроме того, 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
. Как мы обсуждали в руководстве по мастер-страницам и навигации сайта, скины можно использовать для указания значений свойств по умолчанию для элемента Web управления. Таким образом, расширьте существующие настройки, чтобы установить свойство PagerStyle
CssClass
в PagerRowStyle
. Кроме того, давайте настроим интерфейс разбиения на страницы, чтобы отобразить не более пяти числовых кнопок страниц с помощью интерфейса разбиения по страницам 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
Когда пользователь нажимает кнопку в интерфейсе разбиения по страницам, происходит обратная связь и начинается следующий серверный рабочий процесс:
- Событие GridView (или DetailsView или FormView)
PageIndexChanging
запускается - ObjectDataSource повторно запрашивает все данные из BLL; значения свойств GridView, указанных в
PageIndex
иPageSize
, используются для определения, какие записи, возвращаемые из BLL, должны отображаться в GridView. - Событие GridView
PageIndexChanged
запускается
На шаге 2 объект ObjectDataSource повторно запрашивает все данные из источника данных. Этот стиль разбиения по страницам обычно называется разбиением по умолчанию, так как это поведение разбиения по страницам, используемое по умолчанию при задании AllowPaging
свойства в значение true
. При разбиении по умолчанию веб-элемент управления данными наивно извлекает все записи для каждой страницы данных, даже если только подмножество записей фактически отрисовывается в HTML, который отправляется в браузер. Если данные базы данных не кэшируются BLL или ObjectDataSource, по умолчанию разбиение на страницы не работает для достаточно больших результирующих наборов или для веб-приложений с множеством одновременных пользователей.
В следующем руководстве мы рассмотрим, как реализовать настраиваемое разбиение по страницам. С помощью настраиваемого разбиения на страницы можно указать ObjectDataSource получить точный набор записей, необходимых для страницы данных, которую запросили. Как вы можете себе представить, настраиваемое разбиение на страницы значительно повышает эффективность работы с большими наборами данных.
Замечание
Хотя разбиение на страницы по умолчанию не подходит для достаточно больших наборов результатов или для сайтов с множеством одновременных пользователей, следует учесть, что настраиваемое разбиение на страницы требует дополнительных изменений и усилий для реализации и не так просто, как установка соответствующего флажка (что предусмотрено по умолчанию). Таким образом, разбиение по умолчанию может быть идеальным выбором для небольших веб-сайтов с низким трафиком или при разбиении по страницам через относительно небольшие результирующие наборы, так как это гораздо проще и быстрее реализовать.
Например, если мы знаем, что у нас никогда не будет более 100 продуктов в нашей базе данных, минимальное повышение производительности, достигаемое за счет пользовательского разбиения на страницы, скорее всего, перекрывается усилиями, необходимыми для его реализации. Если же однажды у нас будет тысячи или десятки тысяч товаров, не реализовав пользовательское разбиение на страницы, мы значительно затрудним масштабируемость нашего приложения.
Шаг 4. Настройка работы с разбиением на страницы
Веб-элементы управления данными предоставляют ряд свойств, которые можно использовать для улучшения взаимодействия с разбиением по страницам пользователя.
PageCount
Например, свойство указывает, сколько страниц имеется, а PageIndex
свойство указывает на текущую страницу и может быть настроено для быстрого перемещения пользователя на определенную страницу. Чтобы иллюстрировать, как эти свойства могут улучшить опыт пользователя при переходе между страницами, добавим на нашу страницу элемент управления Label, который сообщит пользователю, какую страницу они сейчас просматривают, а также элемент управления DropDownList, позволяющий быстро перейти к любой указанной странице.
Сначала добавьте на страницу элемент управления Label, задайте его свойству ID
значение PagingInformation
, и очистите его свойство Text
. Затем создайте обработчик событий для события GridView DataBound
и добавьте следующий код:
protected void Products_DataBound(object sender, EventArgs e)
{
PagingInformation.Text = string.Format("You are viewing page {0} of {1}...",
Products.PageIndex + 1, Products.PageCount);
}
Этот обработчик событий назначает PagingInformation
свойству Label Text
сообщение, информирующее пользователя о том, сколько страниц они в настоящее время посещают Products.PageIndex + 1
из общей суммы страниц Products.PageCount
(мы добавим 1 в Products.PageIndex
свойство, так как PageIndex
индексируется начиная с 0). Я выбрал свойство Label Text
в DataBound
обработчике событий в отличие от PageIndexChanged
обработчика событий, так как DataBound
событие запускается каждый раз, когда данные привязаны к GridView, а PageIndexChanged
обработчик событий запускается только при изменении индекса страницы. Когда GridView изначально привязан к данным при первом посещении страницы, событие PageIndexChanging
не вызывается, тогда как событие DataBound
вызывается.
С этим дополнением пользователю теперь отображается сообщение, указывающее, какую страницу они посещают и сколько всего страниц данных.
Рис. 10. Отображается текущее число страниц и общее количество страниц (щелкните, чтобы просмотреть изображение полного размера)
Помимо элемента управления Label, давайте также добавим элемент управления DropDownList, который перечисляет номера страниц в GridView с выбранной в данный момент страницей. Идея заключается в том, что пользователь может быстро перейти с текущей страницы на другую, просто выбрав новый индекс страницы из DropDownList. Начните с добавления раскрывающегося списка в конструктор, установки его свойства ID
на PageList
, и активации параметра Enable AutoPostBack через смарт-тег.
Затем вернитесь к обработчику DataBound
событий и добавьте следующий код:
// Clear out all of the items in the DropDownList
PageList.Items.Clear();
// Add a ListItem for each page
for (int i = 0; i < Products.PageCount; i++)
{
// Add the new ListItem
ListItem pageListItem = new ListItem(string.Concat("Page ", i + 1), i.ToString());
PageList.Items.Add(pageListItem);
// select the current item, if needed
if (i == Products.PageIndex)
pageListItem.Selected = true;
}
Этот код начинается с очистки элементов в PageList
DropDownList. Это может показаться лишним, так как одно не ожидает изменения количества страниц, но другие пользователи могут использовать систему одновременно, добавляя или удаляя записи из Products
таблицы. Такие вставки или удаления могут изменить количество страниц данных.
Затем необходимо снова создать номера страниц и сделать так, чтобы тот, который соответствует текущему GridView PageIndex
, был выбран по умолчанию. Мы выполняем это, используя цикл от 0 до PageCount - 1
, добавляя новый ListItem
в каждой итерации и устанавливая значение его свойства Selected
равным true, если текущий индекс итерации равен свойству PageIndex
объекта GridView.
Наконец, необходимо создать обработчик событий для события DropDownList SelectedIndexChanged
, который запускается каждый раз, когда пользователь выбирает другой элемент из списка. Чтобы создать этот обработчик событий, просто дважды щелкните dropDownList в конструкторе, а затем добавьте следующий код:
protected void PageList_SelectedIndexChanged(object sender, EventArgs e)
{
// Jump to the specified page
Products.PageIndex = Convert.ToInt32(PageList.SelectedValue);
}
Как показано на рисунке 11, простое изменение свойства GridView PageIndex
приводит к повторному привязыванию данных к GridView. В обработчике событий GridView DataBound
выбран соответствующий раскрывающийся список ListItem
.
Рис. 11. Пользователь автоматически переходит на шестую страницу при выборе элемента списка Drop-Down страницы 6 (щелкните, чтобы просмотреть изображение полного размера)
Шаг 5. Добавление поддержки сортировки Bi-Directional
Добавление поддержки двунаправленной сортировки так же просто, как и добавление поддержки разбивки на страницы — просто выберите опцию "Включить сортировку" в смарт-теге GridView (что задает для свойства GridView значение AllowSorting
).true
Это преобразует каждый из заголовков полей GridView в виде LinkButtons, которые при нажатии инициируют обратное отправление и возвращают данные, отсортированные по выбранному столбцу в порядке возрастания. При повторном щелчке по тому же заголовку LinkButton данные сортируются в порядке убывания.
Замечание
Если вы используете пользовательский уровень доступа к данным, а не типизированный набор данных, у вас может не быть параметра "Включить сортировку" в смарт-теге GridView. Только GridViews, привязанные к источникам данных, которые изначально поддерживают сортировку, имеют этот флажок. Типизированный набор данных обеспечивает поддержку сортировки из коробки, поскольку ADO.NET DataTable предоставляет метод Sort
, который при вызове сортирует строки данных DataTable по указанным условиям.
Если DAL не возвращает объекты, которые изначально поддерживают сортировку, необходимо настроить ObjectDataSource для передачи сведений сортировки на уровень бизнес-логики, который может сортировать данные или отсортировать данные по DAL. Мы рассмотрим, как сортировать данные на уровнях бизнес-логики и доступа к данным в будущем.
Сортировочные кнопки отображаются как HTML-гиперссылки, текущие цвета которых (синий для не посещенной ссылки и тёмно-красный для посещённой ссылки) конфликтуют с цветом фона строки заголовка. Вместо этого пусть все ссылки в строке заголовка отображаются в белом цвете, независимо от того, были ли они посещены или нет. Это можно сделать, добавив следующий код в класс Styles.css
.
.HeaderStyle a, .HeaderStyle a:visited
{
color: White;
}
Этот синтаксис указывает на использование белого текста при отображении этих гиперссылок в элементе, использующего класс HeaderStyle.
После этого добавления CSS при посещении страницы в браузере экран должен выглядеть примерно так же, как на рис. 12. В частности, на рис. 12 показаны результаты после нажатия ссылки заголовка поля "Цена".
Рис. 12. Результаты были отсортированы по единицам в порядке возрастания (щелкните, чтобы просмотреть изображение полного размера)
Изучение рабочего процесса сортировки
Все поля GridView, BoundField, CheckBoxField, TemplateField и т. д. имеют SortExpression
свойство, указывающее выражение, которое должно использоваться для сортировки данных при нажатии ссылки на заголовок этого поля. GridView также имеет SortExpression
свойство. Когда на кнопку сортировки LinkButton щелкают, GridView назначает значение этого поля SortExpression
своему свойству SortExpression
. Затем данные извлекаются из ObjectDataSource и сортируются в соответствии со свойством GridView SortExpression
. В следующем списке описана последовательность шагов, которые возникают, когда конечный пользователь сортирует данные в GridView:
- В GridView вызывается событие сортировки
- Свойство GridView
SortExpression
установлено в значениеSortExpression
поля, заголовок сортировки которого был выбран с помощью LinkButton. - Объект ObjectDataSource снова извлекает все данные из BLL, а затем сортирует данные с помощью GridView
SortExpression
- Свойство GridView
PageIndex
сбрасывается до 0, то есть при сортировке пользователя возвращается на первую страницу данных (при условии, что поддержка разбиения страниц реализована) - Событие 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 заголовок отображается как текст, а не в виде ссылки, тем самым предотвращая сортировку данных по цене пользователям.
Рис. 14. Удаление свойства SortExpression, пользователи больше не могут сортировать продукты по цене (щелкните, чтобы просмотреть изображение полного размера)
Программная сортировка GridView
Вы также можете сортировать содержимое GridView программным способом с помощью метода GridViewSort
. Просто передайте значение SortExpression
для сортировки вместе с SortDirection
(Ascending
или Descending
), и данные GridView будут вновь отсортированы.
Представьте, что причина, по которой мы отключили сортировку по UnitPrice
, поскольку мы были обеспокоены тем, что наши клиенты просто будут покупать только продукты с самыми низкими ценами. Тем не менее, мы хотим поощрять их покупать самые дорогие продукты, поэтому мы хотели бы, чтобы они могли сортировать продукты по цене, но только от самой дорогой цены до меньшей.
Чтобы выполнить это, добавьте веб-элемент управления Button на страницу, задайте для его свойства ID
значение SortPriceDescending
, а его свойство Text
— "Сортировка по цене". Затем создайте обработчик событий для события Button Click
, дважды щелкнув элемент управления Button в конструкторе. Добавьте следующий код в этот обработчик событий:
protected void SortPriceDescending_Click(object sender, EventArgs e)
{
// Sort by UnitPrice in descending order
Products.Sort("UnitPrice", SortDirection.Descending);
}
Нажатие этой кнопки возвращает пользователя на первую страницу с продуктами, отсортированных по цене, от наиболее дорогих до наименее дорогих (см. рис. 15).
Рис. 15. Нажатие кнопки "Заказ продуктов" от самых дорогих к минимуму (щелкните, чтобы просмотреть изображение полного размера)
Сводка
В этом руководстве мы узнали, как реализовать возможности разбиения по умолчанию и сортировки, оба из которых были так же просто, как проверка флажка! Когда пользователь сортирует данные или перемещается по ним, аналогичный рабочий процесс разворачивается:
- После этого возникает обратная связь
- События предварительного уровня веб-элемента управления данными (
PageIndexChanging
илиSorting
) - Все данные повторно извлекаются объектом ObjectDataSource
- События после уровня событий веб-элемента управления данными (
PageIndexChanged
илиSorted
)
При реализации базового разбиения на страницы и сортировки, это простое дело, необходимо приложить больше усилий, чтобы использовать более эффективное пользовательское разбиение или для дальнейшего улучшения интерфейса для разбиения на страницы или сортировки. В будущих руководствах рассматриваются эти разделы.
Счастливое программирование!
Сведения о авторе
Скотт Митчелл, автор семи книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Учите себя ASP.NET 2,0 за 24 часа. С ним можно связаться по адресу mitchell@4GuysFromRolla.com.