试图在IsPostBack上查找控件时出现NullReferenceException错误

本文关键字:NullReferenceException 错误 控件 查找 IsPostBack | 更新日期: 2023-09-27 18:15:16

我在FormView中有一个菜单/MultiView控件设置,我试图将第一个菜单项设置为Page_Load上选择的。我得到一个NullReferenceException错误的行,我试图设置Selected = True。

标记:

<asp:FormView ID="FormView1" runat="server" CellPadding="4" DataKeyNames="ProjectID" DataSourceID="ProjectDetailsSQL" ForeColor="#333333">
    <ItemTemplate>
        <h1><asp:Label ID="Label1" runat="server" Text='<%# Eval("ProjectID") %>' /> - <asp:Label ID="Label2" runat="server" Text='<%# Bind("ProjectName") %>' /></h1>
        <asp:Menu ID="mnuProject" runat="server" CssClass="MenuStyle" Orientation="Horizontal" OnMenuItemClick="mnuProject_MenuItemClick" EnableViewState="false">
            <staticselectedstyle backcolor="Gray" borderstyle="Solid" bordercolor="Black" borderwidth="1"/>
            <Items>
                <asp:MenuItem Text="General" Value="0" />
                <asp:MenuItem Text="Scope" Value="1" />
                <asp:MenuItem Text="CAD" Value="2" />
                <asp:MenuItem Text="PM" Value="3" />  
                <asp:MenuItem Text="Submittals" Value="4" />
                <asp:MenuItem Text="ChangeOrders" Value="5" />
                <asp:MenuItem Text="Timecards" Value="6" />
                <asp:MenuItem Text="Docs" Value="7" />
                <asp:MenuItem Text="Log" Value="8" />
                <asp:MenuItem Text="Financials" Value="9" />
            </Items>
        </asp:Menu>
        <asp:MultiView ID=MultiView1></asp:MultiView>
    </ItemTemplate>
</asp:FormView>
后台代码:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Menu mnuProject = (Menu)FormView1.FindControl("mnuProject");
                mnuProject.Items[0].Selected = true; <----- Exception thrown here
            }
        }

我也尝试过Menu mnuProject = (Menu)FormView1.Row.FindControl("mnuProject");和mnuProject仍然返回为null。我只能猜测我没有给FindControl正确的位置。如能帮助纠正我的语法,我将不胜感激。

试图在IsPostBack上查找控件时出现NullReferenceException错误

findControl方法不是递归的。

这意味着它将尝试在您请求的项中找到您的控件,而不是它的子控件。换句话说,它正在FormView1中寻找mnuProject,而不是FormView1的任何子控件。

这是我用来解决它的通用实现。你需要使用递归来让它按照你想要的方式运行…你很幸运,我打开了这个项目:-)

public static class pageHelpers
{
            public static System.Web.UI.Control FindControlRecursive(System.Web.UI.Control root, string id)
            {
                if (root.ID == id)
                {
                    return root;
                }
                foreach (System.Web.UI.Control c in root.Controls)
                {
                    System.Web.UI.Control t = pageHelpers.FindControlRecursive(c, id);
                    if (t != null)
                    {
                        return t;
                    }
                }
                return null;
            }
}

让我们重构你的页面代码,这样我们就可以确定是否解决了这个问题。

  Menu mnuProject = (Menu)pageHelpers.FindControlRecursive(FormView1,"mnuProject");
  // lets test to see if our FindControlRecursive method worked before doing anything else
  if(mnuProject == null) {throw new Exception("FindControlRecursive failed!");}
  mnuProject.Items[0].Selected = true; <----- Exception thrown here