Измените значение элемента управления с привязкой к базе данных внутри ретрансляторов на C#
-
05-07-2019 - |
Вопрос
У меня есть вложенный элемент управления repeater, который отображает список данных, в моем случае это список часто задаваемых вопросов.вот часть дизайна:
<asp:Repeater ID="lists" runat="server">
<ItemTemplate>
<h2 class="sf_listTitle"><asp:Literal ID="listTitle" runat="server"></asp:Literal></h2>
<p class="sf_controlListItems">
<a id="expandAll" runat="server">
<asp:Literal ID="Literal1" runat="server" Text="<%$Resources:ExpandAll %>"></asp:Literal>
</a>
<a id="collapseAll" runat="server" style="display:none;">
<asp:Literal ID="Literal2" runat="server" Text="<%$Resources:CollapseAll %>"></asp:Literal>
</a>
</p>
<ul class="sf_expandableList" id="expandableList" runat="server">
<asp:Repeater ID="listItems" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ItemTemplate>
<li>
<h1 id="headlineContainer" runat="server" class="sf_listItemTitle">
<a id="headline" runat="server" title="<%$Resources:ClickToExpand %>"></a>
</h1>
<div id="contentContainer" runat="server" class="sf_listItemBody" style="display:none;">
<asp:Literal ID="content" runat="server"></asp:Literal>
</div>
</li>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>
</ul>
</ItemTemplate>
</asp:Repeater>
Ретранслятор, который меня интересует, - это второй ретранслятор, listItems
.В моем коде, я не могу напрямую вызвать listItems
и посмотрите на элементы управления внутри него.Я попытался захватить контроль внутри list.DataBinding
(может быть, мне нужно использовать другое событие?) метод:
void lists_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
var oRepeater = (Repeater) lists.FindControl("listItems");
}
но это всплывает как null
.Кто-нибудь может дать мне несколько советов о том, что мне нужно сделать, чтобы получить доступ к listItems
ретранслятор и его дочерние элементы управления?
Спасибо!
Решение
lists
принадлежит каждому RepeaterItem, а не непосредственно самому Repeater.
Попробуй :-
void lists_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ( e.Item.ItemType == ListItemType.AlternatingItem
|| e.Item.ItemType == ListItemType.Item )
{
Repeater oRepeater = (Repeater)e.Item.FindControl("listItems");
// And to get the stuff inside.
foreach ( RepeaterItem myItem in oRepeater.Items )
{
if ( myItem.Item.ItemType == ListItemType.AlternatingItem
|| myItem.Item.ItemType == ListItemType.Item )
{
Literal myContent = (Literal)myItem.FindControl("content");
// Do Something Good!
myContent.Text = "Huzzah!";
}
}
}
}
И ты должен быть хорошим :)
Отредактировано, чтобы включить полезную доработку DavidP.
Другие советы
Вам нужно изменить эту строку на
var oRepeater = (Repeater) e.Item.FindControl("listItems");
Ты близко!Внутри вашего обработчика событий проверьте RepeaterItemEventArgs на предмет того, с какой строкой вы имеете дело.Ваш дочерний повторитель будет доступен только в строках элементов (Alt), а не в верхних или нижних колонтитулах.Я предполагаю, что это происходит из-за заголовка.