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