четверг, 13 января 2011 г.

ListView , Paging ( DataPager) и как обнулить индекс страницы для пейджинга.

Для того чтобы заполучить в свое распоряжение разбивку на страницы ( Paging ) в ListView необходимо использовать контрол DataPager. DataPager может быть расподожен  как пределах ListView в LayoutTemplate так и за пределами ListView . Но тогда для DataPager необходимо установить свойство PagedControlID которое будет указывать на наш ListView. Ниже два примера использования.

Внутри ListView
<asp:ListView  ID="ListView1"  runat="server">
 <LayoutTemplate>
  <ul>
   <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
  </ul>
  <asp:DataPager ID="Pager1" runat="server" PageSize="40">
   <Fields>
    <asp:NumericPagerField />
   </Fields>
  </asp:DataPager>
      
 </LayoutTemplate>
 <ItemTemplate>
  <li>
   <asp:Literal ID="litContent" runat="server"/>
  </li>
 </ItemTemplate>
</asp:ListView>

За Пределами ListView
<asp:ListView  ID="ListView1"  runat="server">
 <LayoutTemplate>
  <ul>
   <asp:PlaceHolder runat="server" ID="itemPlaceholder" />
  </ul>
 </LayoutTemplate>
 <ItemTemplate>
  <li>
   <asp:Literal ID="litContent" runat="server"/>
  </li>
 </ItemTemplate>
</asp:ListView>
<asp:DataPager ID="Pager1" PagedControlID="ListView1" runat="server" PageSize="40">
   <Fields>
    <asp:NumericPagerField />
   </Fields>
</asp:DataPager>


Я предпочитаю использовать  DataPager за пределами ListView. Все нижеописаноое будет относиться к этому варианту использования.

Итак дальше... Предоложим у нас имеется  некая поисковая форма и кнопка "Искать". Пользователь вводит данные  в форму и нажимает кнопку.  По нажатию происходит выборка данных и наполнение ListView

А теперь ситуация... Допустим по условиям выборки в  ListView попадает 100 строк. Наш пейджинг ( с установкой в 40 записей ) разобьет все это дело на три страницы. Пользователь переходит на третью страницу, вводит новые параметры для поиска и опять нажимает "Искать". Теперь наша выборка содержит только 10 строк. Производим наполение ListView и видим только форму поиска и пейджинг - а самого ListView нет, хотя мы точно знаем, что данными он был наполнен.

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

Pager1.SetPageProperties(0, 40, True)

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


1 комментарий:

  1. Спасибо! Очень помогла ваша статья.
    Я использовал несколько модифицированный код.

    Взамен "жестко закодированного значения" можно использовать установки DataPager

    Pager1.SetPageProperties(0, Pager1.MaximumRows, True)

    ОтветитьУдалить