当我尝试在Object reference not set to an instance of an object
内找到Panel
控件时,我一直收到Repeater
错误。但其他控制措施都很好吗?任何人都可以看到这里有什么问题吗?
这就是我选择控件的方式:
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 *
答案 0 :(得分:5)
问题在于您对不同的转发器使用相同的方法。
在您上次更新时,您发布了整个标记和代码,如果您搜索标记,则可以找到在多个转发器上使用的rptCategories_OnItemDataBound
:
<asp:Repeater ID="rptCategories" runat="server" OnItemDataBound="rptCategories_OnItemDataBound">
和
<asp:Repeater ID="rptInnerCategories" runat="server" OnItemDataBound="rptCategories_OnItemDataBound">
答案 1 :(得分:1)
根据documentation of FindControl() method on msdn,它只会找到一个控件,如果它是您正在搜索的元素的直接子项。
在您的情况下情况并非如此,这就是您无法以这种方式找到控件的原因。您应该找到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。
答案 2 :(得分:0)
使用此
Panel pnlSubCategories = (Panel)liCategory.FindControl("pnlSubCategories");