无效引用异常 - 为什么?

时间:2010-11-19 21:17:08

标签: c# asp.net

Panel pnl_Confirmation = (Panel)form1.FindControl("ConfirmationPanel") as Panel;
    pnl_Confirmation.Visible = false;

我在上面的代码中不断收到“NullReferenceException”。 “ConfirmationPanel”是我显示/隐藏的面板,具体取决于表单是否成功提交。

面板包含在LoginView控件中,这就是我无法直接调用“ConfirmationPanel”的原因:

<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate> 
<asp:Panel id="ConfirmationPanel" runat="server" Wrap="False">

...

为什么这是空的?应该使用ID“ConfirmationPanel”引用Panel,不是吗?

由于

5 个答案:

答案 0 :(得分:4)

试试这个:

Panel pnl_Confirmation = LoginView1.FindControl("ConfirmationPanel") as Panel;
if(pnl_Confirmation != null)
   pnl_Confirmation.Visible = false;

答案 1 :(得分:2)

这完全取决于您拥有该代码的位置。如果你在Page_Load()之前有它,那么控制树可能还没有构建,因此是空引用。

答案 2 :(得分:1)

使用 LoginView 的FindControl代替

Panel pnl_Confirmation = LoginView1.FindControl("ConfirmationPanel") as Panel;

因为它是LoginView模板的一部分。

答案 3 :(得分:1)

“仅当控件直接包含在指定的容器中时,FindControl才会找到控件;也就是说,该方法不会在控件内的控件层次结构中进行搜索。”(来自MSDN文档)

即。在LoginView上调用FindControl或创建递归FindControl

答案 4 :(得分:0)

似乎你试图进行两次类型转换。

尝试仅使用一次最佳效果进行类型转换:

Panel pnl_Confirmation = (Panel)form1.FindControl("ConfirmationPanel");

Panel pnl_Confirmation = form1.FindControl("ConfirmationPanel") as Panel;

在尝试访问之前验证您的引用是否为null也很重要

if (pnl_Confirmation != null)
    pnl_Confirmation.Visible = false;