Для того чтобы заполучить в свое распоряжение разбивку на страницы ( 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, отображающего результаты поиска.
Спасибо! Очень помогла ваша статья.
ОтветитьУдалитьЯ использовал несколько модифицированный код.
Взамен "жестко закодированного значения" можно использовать установки DataPager
Pager1.SetPageProperties(0, Pager1.MaximumRows, True)