В первой статье Использование Repeater с ObjectDataSource, посвященной элементу управления Repeater, мы рассмотрели базовые принципы использования данного контрола. Сегодня же, как я и обещал, мы попробуем прицепить в выводе конкретной статьи еще и комментарии. И все это дело мы реализуем на том же Repeater. Естественно, существует несколько иных, более или менее подходящих под данную задачу, но вопрос сейчас не в выборе наилучшего варианта, а реализация идеи именно с помощью Repeater.
Здесь я уже не буду описывать бихайн-код и класс ObjectDataSource. Сейчас загвоздка стои имеено в шаблоне самого Repeater.
Итак.
Вспомним, что изначально репитер создан для вывода на странице многократно повторяющихся данных. Точнее, разных данных, но в повторяющемся режиме. Что то типа табличного представления.
Но если сейчас задача стоит в выводе текста одной единственной статьи, а не анонсов многих статей, как в прошлой статье, тогда почему наш выбор остановился именно на повторителе (Repeater)?!
Дело в том, что повторения предполагают комментарии к данной статье. Ведь комментариев может быть несколько и очень много.
Вот теперь задача сводится к биндингу данных для вывода комментариев.
Казалось бы, загоним статью в Header-блок, а комментарии в Item-блок:
<asp:Repeater ID="Repeater1" runat="server"
onitemdatabound="ItemDataBound" >
<HeaderTemplate>
<table>
<tr>
<td class="ArticlesBox"><br />
<h2 id="h2u2"><%# Eval("Title")%></h2><br />
<div id="Prebody2"><%# Eval("Prebody")%></div><br />
<div id="articleBody"><%# Eval("Body")%></div><br /><br />
</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<br />
<table width="100%">
<tr>
<td>
<pre class="comment">
<span style="color:#707070; text-transform:uppercase;">
<%# Eval("Nic")%>    <%# Eval("commentDate")%></span>
<p><%# Eval("CommentBody")%></p>
</pre>
</td>
</tr>
</table>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
Но не тут то было. Пока что, репитер не поддерживает функцию биндинга в хедере. Возможно в следующих сборках FrameWork этот недочет исправят, но пока надо как то обходить это ограничение.
Решается проблема просто.
Текстовку статьи вытягивать теперь будет не контрол привязки ObjectDataSource (или любой другой), а бихайн-код. И вытягивать придется в переменные класса – поля Title, Prebody, Body. Просто вытащите из БД требуемую статью и в эти стринговые переменные занесите соответствующую информацию. А в хедере репитера вместо функции Eval используем «Response.Write», или эквивалент «=»:
<asp:Repeater ID="Repeater1" runat="server"
onitemdatabound="ItemDataBound" >
<HeaderTemplate>
<table>
<tr>
<td class="ArticlesBox"><br />
<h2 id="h2u2"><% =Title%></h2><br />
<div id="Prebody2"><% =Prebody%></div><br />
<div id="articleBody"><% =Body%></div><br /><br />
</td>
</tr>
</table>
</HeaderTemplate>
<ItemTemplate>
<br />
<table width="100%">
<tr>
<td>
<pre class="comment">
<span style="color:#707070; text-transform:uppercase;">
<%# Eval("Nic")%>    <%# Eval("commentDate")%></span>
<p><%# Eval("CommentBody")%></p>
</pre>
</td>
</tr>
</table>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
Таким вот нехитрым способом мы обошли невозможность прямой привязки в хедере и футере репитера.
Теперь вы знаете на один способ больше вывода повторяющихся данных вместе с единственным блоком дополнительной информации. Теперь, я надеюсь, вы более гибко будете применять Repeater.
Вообще, если хорошенько подумать, можно с любого контрола отображения данных «вычудить» то, что необходимо, но прежде все же лучше поинтересоваться на предмет существования специального контрола, а не «мучать» первый попавшийся.
Применяйте и наслаждайтесь :)