2

我在面板内有一个中继器。
在这个中继器里面我有另一个面板。在某些条件下,我想设置这个panel.visibility = false

在后面的代码中,我尝试找到面板OnItemDataBound并设置可见 = 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;
    }

我究竟做错了什么?

4

1 回答 1

3

一个问题是您直接调用中继器,而不是绑定项目模板 -e.Item.FindControl而不是Repeater1.FindControl.

另一个问题是该ItemDataBound事件也将针对页眉和页脚触发,并且您没有检查您在中继器中所在的列表项的类型( ListItemType枚举)。

由于您没有标题项目(这将是调用处理程序的第一个项目),因此没有面板控件并且强制转换失败。

您只需要ItemAlternatingItem项目类型:

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;
    }
}
于 2010-07-28T07:50:22.170 回答