Использование элементов управления 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

Скачать исходники примеров