Использование элементов управления ListView и DataPager в ASP.NET 3.5 - Группировка информации при помощи элемента управления ListView

ОГЛАВЛЕНИЕ

Группировка информации при помощи элемента управления ListView

Элемент управления ListView содержит два шаблона: LayoutTemplate и ItemTemplate. LayoutTemplate обрабатывается для генерации разметки элемента ListView и может содержать ссылку на ItemTemplate, который используется для того, чтобы обрабатывать каждую запись, привязанную к элементу ListView. LayoutTemplate ссылается на ItemTemplate посредством элемента управления серверной стороны (таким, как PlaceHolder), чье ID является таким же, как и свойство ItemPlaceholderID элемента ListView. (Свойство ItemPlaceholderID имеет стандартное значение "itemPlaceholder".)

Ссылка напрямую на ItemTemplate из LayoutTemplate является хорошей идеей в случае, если разметка внешнего вида для каждого элемента списка одинакова, но в некоторых случаях различная разметка внешнего вида должна быть предоставлена для каждого n-го элемента. Такая специализация возможна при помощи указания GroupTemplateGroupItemCount элемента ListView в n. Далее, вместо того, чтобы ссылаться на ItemTemplate в LayoutTemplate, заставьте LayoutTemplate ссылаться на GroupTemplate, а GroupTemplate ссылаться на ItemTemplate. В таком случае ItemTemplate все еще будет обоработан для каждой записи, связанной с элементом ListView, но при этом заставляет GroupTemplate обрабатываться каждые n записей, где n равно GroupItemCount. (Группового шаблона) и установки свойства

Для того, чтобы лучше понять способ группировки при помощи ListView, давайте рассмотрим первый пример, демонстрирующий набор записей в упорядоченном списке, и использующий следующую декларативную разметку для элемента управления ListView:

<asp:ListView ID="..." runat="server" DataSourceID="...">
   <LayoutTemplate>
      <ol>
         <asp:PlaceHolder runat="server" ID="itemPlaceholder"></asp:PlaceHolder>
      </ol>
   </LayoutTemplate>

   <ItemTemplate>
      <li><%# Eval("columnName") %></li>
   </ItemTemplate>
</asp:ListView> 

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

<asp:ListView ID="ProductList1" runat="server" 
   DataSourceID="ProductDataSource"
   GroupItemCount="3" ItemPlaceholderID="itemsGoHere"
   GroupPlaceholderID="groupsGoHere">

   <LayoutTemplate>
      <p>
         <asp:PlaceHolder runat="server" ID="groupsGoHere"></asp:PlaceHolder>
      </p>
   </LayoutTemplate>

   <GroupTemplate>
      <ol>
         <asp:PlaceHolder runat="server" ID="itemsGoHere"></asp:PlaceHolder>
      </ol>
   </GroupTemplate>

   <ItemTemplate>
      <li><%#Eval("ProductName")%></li>
   </ItemTemplate>
</asp:ListView> 

Декларативная разметка элемента управления ListView имеет элемент <ol> в GroupTemplate. LayoutTemplate должен присутствовать и в данном примере ссылается на GroupLayout. Обратите внимание на то, что вместо того, чтобы изменять стандартные значения для группы и указателей места заполнения элементов ("groupPlaceholder" и "itemPlaceholder") я явно изменил данные значения при помощи свойств ItemPlaceHolderID и GroupPlaceholderID элемента ListView.

Представьте, что указанный выше ListView привязан к таблице сотрудников базы данных, и что в ItemTemplate мы обрабатывали колонку FullName в пределах элемента <li>. Как же будет выглядеть обработанная разметка элемента ListView?

В принципе, ListView начнет обрабатывать свой LayoutTemplate:

<p>
   <asp:PlaceHolder runat="server" ID="groupsGoHere"></asp:PlaceHolder>
</p> 

Затем он будет обрабатывать свой GroupTemplate для каждой группы из трех записей, привязанных к элементу ListView. Предположив, что всего было восемь сотрудников, мы в результате получили бы следующую разметку:

<ol>
  <asp:PlaceHolder runat="server" ID="itemsGoHere"></asp:PlaceHolder>
</ol>

<ol>
  <asp:PlaceHolder runat="server" ID="itemsGoHere"></asp:PlaceHolder>
</ol>

<ol>
  <asp:PlaceHolder runat="server" ID="itemsGoHere"></asp:PlaceHolder>
</ol>

Затем для каждой записи привязанной к элементу ListView был бы обработан ItemTemplate. В результате вы получите следующую разметку:

<li>Scott Mitchell</li>
<li>Sam Smith</li>
<li>Jisun Lee</li>
<li>Andrew Fuller</li>
<li>Edgar Johnson</li>
<li>Ellen Plank</li>
<li>Tito Wald</li>
<li>Layla Clapton</li> 

Обработанная разметка ItemTemplates будет расположена в соответствующих элементах управления GroupLayout PlaceHolder, и выглядит это следующим образом:

<p>
<ol>
<li>Scott Mitchell</li>
<li>Sam Smith</li>
<li>Jisun Lee</li>
</ol>
<ol>
<li>Andrew Fuller</li>
<li>Edgar Johnson</li>
<li>Ellen Plank</li>
</ol>
<ol>
<li>Tito Wald</li>
<li>Layla Clapton</li>
</ol>
</p>