我有一个登录视图控件,我可以使用findcontrol找到它。其内部是LoggedInTemplate-> ul-> li-> ul-> li-> a。我该怎么找到?以下是示例代码:
<asp:LoginView runat="server" ViewStateMode="Disabled" ID="a"> <LoggedInTemplate> <ul class="nav navbar-centered navbar-nav" id="second-menu" role="menu" > <li class="dropdown"><a runat="server" href="" class="dropdown-toggle" >AB</span></a> <ul class="dropdown-menu"> <li><a runat="server" id="link">Link</a></li>
这有效:
LoginView a = (LoginView)this.Master.FindControl("a");
但这并不是:
HyperLink dashboardLink = (HyperLink)a.FindControl("link");
答案 0 :(得分:0)
仅当控件是直接控件时,此方法才会找到控件 包含在指定的容器中;也就是说,该方法没有 在控件中的控件层次结构中搜索。对于 有关如何在不知道控件的情况下查找控件的信息 直接容器,请参见如何:按ID访问服务器控件。
所以你必须编写自己的递归查找方法:
private Control FindControlRecursive(Control rootControl, string controlID)
{
if (rootControl.ID == controlID) return rootControl;
foreach (Control controlToSearch in rootControl.Controls)
{
Control controlToReturn =
FindControlRecursive(controlToSearch, controlID);
if (controlToReturn != null) return controlToReturn;
}
return null;
}
您可以这样使用:
LoginView a = (LoginView)this.Master.FindControl("a");
HyperLink dashboardLink = (HyperLink)FindControlRecursive(a,"link");
或简单地说:
HyperLink dashboardLink = (HyperLink)FindControlRecursive(this.Master,"link");
但要实现这一点,你必须使用
<a runat="server" ID="link">Link</a>
因为“ID”区分大小写,据我所知。
修改强> 根据{{3}},您只需使用其名称(ID)即可访问该控件。
当控件不在命名容器内时,您可以获得一个 使用控件的ID引用它。
这篇文章也有示例代码。