在LoginView中深入查找控件

时间:2014-03-31 22:16:24

标签: c# asp.net findcontrol

我有一个登录视图控件,我可以使用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");

1 个答案:

答案 0 :(得分:0)

来自MSDN page of FindControl

  

仅当控件是直接控件时,此方法才会找到控件   包含在指定的容器中;也就是说,该方法没有   在控件中的控件层次结构中搜索。对于   有关如何在不知道控件的情况下查找控件的信息   直接容器,请参见如何:按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引用它。

这篇文章也有示例代码。