0

Object reference not set to an instance of an object当我尝试PanelRepeater. 但是其他控件都发现没问题?谁能看到这里有什么问题?

这就是我选择控件的方式:

Panel pnlSubCategories = (Panel)e.Item.FindControl("pnlSubCategories");

标记:

<asp:Repeater ID="rptInnerCategories" runat="server" OnItemDataBound="rptCategories_OnItemDataBound">
  <ItemTemplate>
       <li id="liCategory" runat="server">
           <asp:HyperLink ID="lnkCategory" runat="server">
                <span><asp:Literal ID="litCategory" runat="server" Visible="true" /></span>
                <asp:Image ID="imgMan" runat="server" Visible="false" /></asp:HyperLink>

                <asp:Panel ID="pnlSubCategories" runat="server" Visible="false">
                  <ul>
                     <asp:Repeater ID="rptSubCategories" runat="server" Visible="false" OnItemDataBound="rptSubCategories_OnItemDataBound">
                      <ItemTemplate>
                        <li id="liSubCategory" runat="server">
                         <asp:HyperLink ID="lnkSubCategory" runat="server">
                          <span><asp:Literal ID="litSubCategory" runat="server" /></span></asp:HyperLink>
                        </li>
                       </ItemTemplate>
                      </asp:Repeater>
                  </ul>
                 </asp:Panel>
        </li>            
   </ItemTemplate>
</asp:Repeater>

后面的代码:

if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
     Category category = (Category)e.Item.DataItem;
     HyperLink lnkCategory = (HyperLink)e.Item.FindControl("lnkCategory");
     Literal litCategory = (Literal)e.Item.FindControl("litCategory");
     HtmlGenericControl liCategory = (HtmlGenericControl)e.Item.FindControl("liCategory");
     Image imgMan = (Image)e.Item.FindControl("imgMan");

     Panel pnlSubCategories = (Panel)e.Item.FindControl("pnlSubCategories");
     Repeater subCategories = (Repeater)e.Item.FindControl("rptSubCategories");

     if (category.ParentCategoryId != 0)
     {
          pnlSubCategories.Visible = true; //Getting the error on this line

谢谢你的帮助。

编辑*到目前为止我尝试过的内容:

Panel pnlSubCategories = (Panel)liCategory.Controls[0].FindControl("pnlSubCategories");

Panel pnlSubCategories = (Panel)liCategory.Controls[1].FindControl("pnlSubCategories");

Panel pnlSubCategories = (Panel)Page.FindControl("pnlSubCategories");

Panel pnlSubCategories = (Panel)e.Item.FindControl("pnlSubCategories");

但我仍然得到同样的错误......

编辑 2*

我注释掉了Panel控件,它也找不到Repeater subCategories下面的控件?这里发生了可怕的错误......

编辑 3*

代码隐藏标记

4

3 回答 3

5

问题是您对不同的中继器使用相同的方法。

在您上次更新中,您发布了整个标记和代码,如果您搜索标记,您可以找到rptCategories_OnItemDataBound在多个转发器上使用的:

<asp:Repeater ID="rptCategories" runat="server" OnItemDataBound="rptCategories_OnItemDataBound">

<asp:Repeater ID="rptInnerCategories" runat="server" OnItemDataBound="rptCategories_OnItemDataBound">
于 2012-08-15T12:04:15.327 回答
1

根据msdn 上 FindControl() 方法的文档,如果它是您正在搜索的元素的直接子元素,它只会找到一个控件。

在您的情况下并非如此,这就是为什么您无法以这种方式找到控件的原因。你应该找到liCategory,然后lnkCategory,然后pnlSubCategories

所以,试试这个代码:

Control liElement = (Control)e.Item.FindControl("liCategory");
Panel pnlSubCategories = (Panel)liElement .FindControl("pnlSubCategories");

编辑

我已经更正了代码片段,现在应该可以了:)。

或者,您可以编写该FindControl()方法的递归版本并使用它。但是,当您希望解决方案独立于页面结构时,应该使用它。您可以在这里找到这种递归方法的一些示例实现:http: //geekswithblogs.net/QuandaryPhase/archive/2009/05/06/asp.net-recursive-findcontrol-amp-extension-methods.aspx

于 2012-08-15T11:20:01.953 回答
0

用这个

Panel pnlSubCategories = (Panel)liCategory.FindControl("pnlSubCategories");
于 2012-08-15T10:07:49.570 回答