我有一个嵌套的转发器控件,显示一个数据列表,在我的例子中,它是一个FAQ列表。这是设计部分:
<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
转发器及其子控件?
谢谢!
答案 0 :(得分:3)
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的有用改进。
答案 1 :(得分:1)
您需要将该行更改为
var oRepeater = (Repeater) e.Item.FindControl("listItems");
答案 2 :(得分:0)
你很亲密!在事件处理程序中,检查RepeaterItemEventArgs以查找您正在处理的行类型。您的子转发器仅适用于(Alt)项目行,而不是页眉或页脚。我的猜测是它在标题上爆炸了。