代码之家  ›  专栏  ›  技术社区  ›  Kolten

空引用异常-为什么?

  •  1
  • Kolten  · 技术社区  · 14 年前
    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">
    

    ...

    为什么这是空的?它应该引用标识为“ConfirmationPanel”的面板,不是吗?

    谢谢

    5 回复  |  直到 14 年前
        1
  •  4
  •   Gabe    14 年前

    试试这个:

    Panel pnl_Confirmation = LoginView1.FindControl("ConfirmationPanel") as Panel;
    if(pnl_Confirmation != null)
       pnl_Confirmation.Visible = false;
    
        2
  •  2
  •   Otávio Décio    14 年前

    这完全取决于你的代码在哪里。如果在Page_Load()之前有它,则可能尚未构建控件树,因此为空引用。

        3
  •  1
  •   Marko    14 年前

    使用的FindControl 登录视图 相反

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

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

        4
  •  1
  •   Mister Cook    14 年前

    只有当控件直接包含在指定的容器中时,FindControl才能找到控件;也就是说,该方法不在控件中的控件层次结构中搜索(来自MSDN文档)

    i、 e.在LoginView上调用FindControl或创建递归FindControl

        5
  •  0
  •   Will Marcouiller    14 年前

    你好像试着打字两次。

    试着只排版一次,其中任何一种效果最好:

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

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

    在尝试访问引用之前,验证引用是否不为空也很重要

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