我在面板内有一个中继器。
在此中继器中,我还有另一个面板。在某些条件下,我想设置此panel.visibility = false
。
在后面的代码中,我尝试在OnItemDataBound
上定位面板并设置visible = false。但是它仅返回Object reference not set to an instance of an object.
。我猜测是因为找不到面板。
这是我的代码:
<asp:Panel ID="Panel1" runat="server">
<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="repComments_OnDataBound">
<ItemTemplate>
<div>
<asp:Panel runat="server" ID="commentAdminPanel" CssClass="floatRight" >
<img id='deleteComment' class='deleteComment' src='/img/delete1.jpg' />
</asp:Panel>
</div>
</div>
</ItemTemplate>
</asp:Repeater>
</asp:Panel>
这是我的代码背后:
protected void repComments_OnDataBound(Object sender, RepeaterItemEventArgs e)
{
Panel panel = (Panel)Repeater1.FindControl("commentAdminPanel");
panel.Visible = false;
}
我究竟做错了什么?
最佳答案
一个问题是您直接呼叫中继器,而不是绑定项目模板-e.Item.FindControl
而不是Repeater1.FindControl
。
另一个问题是ItemDataBound
事件也会针对页眉和页脚触发,并且您没有检查在转发器中使用的列表项(ListItemType枚举)的类型。
由于您没有标题项(这是调用处理程序的第一个项目),因此没有面板控件,并且转换失败。
您只需要Item
和AlternatingItem
项目类型:
protected void repComments_OnDataBound(Object sender, RepeaterItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem )
{
Panel panel = (Panel)e.Item.FindControl("commentAdminPanel");
panel.Visible = false;
}
}