尝试FindControl时出现NullReferenceException错误!IsPostBack

时间:2015-09-30 17:19:04

标签: c# asp.net nullreferenceexception

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

标记:

<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提供正确的位置。任何纠正我的语法的帮助都将非常感激。

1 个答案:

答案 0 :(得分:1)

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