Использование элементов управления ListView и DataPager в ASP.NET 3.5 - Создание специализированного интерфейса перелистывания с TemplatedPagerField
ОГЛАВЛЕНИЕ
Создание специализированного интерфейса перелистывания с TemplatedPagerField
Если ни NumericPagerField , ни NextPreviousPagerField не соответствуют вашим требованиям, то вы можете создать специализированный интерфейс перелистывания используя TemplatedPagerField. При помощи данного поля вы, как разработчик, ответственны за создание интерфейса перелистывания, а также за определение момента, когда пользователь взаимодействует с интерфейсом и обновление DataPager и ListView в ответ на его действия.
Давайте создадим интерфейс перелистывания, который перечисляет доступные страницы в качестве ListItems в элементе управления DropDownList, тем самым позволяя пользователю переходить на конкретную страницу выбрав ее номер в выпадающем списке. Для этого добавьте элемент управления DataPager на страницу и настройте его DataPagerFields, при этом добавляя также TemplatedPagerField. Содержимое шаблона может быть определено напрямую в разметке либо посредством опции Edit Templates (Редактировать шаблоны) в смарт теге DataPager. В любом случае добавьте элемент управления DropDownList к шаблону и установите его ID в PageJump , а также свойство AutoPostBack в True.
Нашим следующим заданием будет заполнение списка (DropDownList) номерами различных страниц. Поскольку это должно быть выполнено каждый раз как ListView будет привязан к его источнику данных, вам необходимо создать обработчик для события DataBound элемента ListView и добавить в него следующий код:
Protected Sub ProductList_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProductList.DataBound
Dim currentPage As Integer = (DataPagerID.StartRowIndex / DataPagerID.PageSize) + 1
Dim totalPages As Integer = DataPagerID.TotalRowCount / DataPagerID.PageSize
'Заполнение DropDownList
Dim ddl As DropDownList = CType(DataPagerID.Controls(0).FindControl("PageJump"), DropDownList)
If ddl.Items.Count = 0 Then
'Добавление элемента списка для каждой страницы
For i As Integer = 1 To totalPages
ddl.Items.Add(i.ToString())
Next
'Установка DDL в соответствующее значение страницы
ddl.Items.FindByValue(currentPage.ToString()).Selected = True
End If
End Sub
Код начинает обработку номера текущей страницы, а также общего числа страницы - данная информация получена из свойств StartRowIndex, PageSize и TotalRowCount элемента DataPager.
Далее осуществляется ссылка программным путем нам PageJump DropDownList . Обратите внимание, что для осуществления ссылки на элемент управления в пределах TemplatePagerField нам необходимо использовать специфический код: DataPagerID.Controls(0).FindControl("controlID"). По какой-то причине не существует свойства для элемента DataPager или его TemplatePagerField , которое позволяло бы осуществлять доступ к обработанному содержимому шаблона. Поэтому нам необходимо изящно обойти проблемы путем работы напрямую через набор Controls. Цикл перечисляет номера страниц (от 1 до totalPages) и добавляет ListItem для каждой страницы. Наконец, выбирается элемент DropDownList с номером текущей страницы.
При посещении страницы вы увидите, что интерфейс DataPager включает в себя DropDownList с ListItem для каждой страницы. Более того, выбор другой страницы из списка вызывает постбэк, но отображаемое содержимое не меняется. Это происходит потому, что нам нужно также обрабатывать событие SelectedIndexChanged элемента DropDownList - здесь мы должны вызвать метод SetPageProperties элемента DataPager, передавая новые значения StartRowIndex и MaximumRows, тем самым он сможет обновить внешний вид элемента ListView .
Создание обработчика события для элемента управления в пределах шаблона требует добавление синтаксиса OnEventName=EventHandler к декларативной разметке элемента. Это можно добавить вручную, либо автоматически создать синтаксис, перейдя к режиму Edit Templates и дважды щелкнув по DropDownList. В любом случае, как только обработчик события будет создан, добавьте следующий код:
Protected Sub PageJump_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim PageJumpDDL As DropDownList = CType(sender, DropDownList)
Dim pageNo As Integer = Convert.ToInt32(PageJumpDDL.SelectedValue)
Dim startRowIndex As Integer = (pageNo - 1) * ProductListPager.PageSize
DataPagerID.SetPageProperties(startRowIndex, DataPagerID.PageSize, True)
End Sub
Указанный выше код начинает работу с программной ссылки на элемент управления PageJump (DropDownList) для того, чтобы выяснить его значение SelectedValue. Требуемый номер страницы используется для подсчета StartRowIndex и данная информация (а также свойство PageSize элемента DataPager) передается в метод SetPageProperties элемента DataPager.
Конечным результатом проделанной работы будет выпадающий список (DropDownList), содержащий номер каждой страницы. Изменение выбранной страницы вызывает запуск постбэка и отображает информацию выбранной страницы.

Веселого программирования!
Scott Mitchell