I have a repeater inside a panel.
Inside this repeater I have another panel.Upon certain conditions, I want to set thispanel.visibility = false
.
In the code behind, I try locating the panels on OnItemDataBound
and set visible=false. But it only returns Object reference not set to an instance of an object.
. I guesing it's because it can't locate the panel.
Here is my code:
<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>
And here is my code behind:
protected void repComments_OnDataBound(Object sender, RepeaterItemEventArgs e)
{
P开发者_StackOverflowanel panel = (Panel)Repeater1.FindControl("commentAdminPanel");
panel.Visible = false;
}
What am I doing wrong?
One issue is that you are calling the repeater directly, instead of the bound item template - e.Item.FindControl
instead of Repeater1.FindControl
.
The other issue is that the ItemDataBound
event will also fire for header and footer, and you are not checking the type of list item (ListItemType enum) you are on in the repeater.
Since you don't have a header item (which would be the first item to call the handler), there is no panel control and the cast fails.
You only need the Item
and AlternatingItem
item types:
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;
}
}
精彩评论