如何从ASP.NET中的UserControl访问父页面控件?

时间:2013-10-30 06:14:31

标签: c# asp.net user-controls

我有一个asp页“childPage.aspx”“masterPage.aspx”作为母版页。 childPage.aspx 具有用户( userControl.ascx )对其的控制权。现在我试图从用户控件访问childPage.aspx上的控件。我试图访问chilPage.aspx控件如下:

HtmlContainerControl ProductMenu= (HtmlContainerControl)Page.FindControl("ProductMenu");

HtmlContainerControl ProductMenu= (HtmlContainerControl)this.Page.FindControl("ProductMenu");

HtmlContainerControl ProductMenu= (HtmlContainerControl)Parent.FindControl("ProductMenu");

HtmlContainerControl ProductMenu= (HtmlContainerControl)this.Parent.parent.FindControl("ContaintHolder").FindControl("ProductMenu")

在上面的代码 ProductMenu 是childPage.aspx中 div (runat服务器)的 id 。现在我试图从我的用户控件访问它,但根本无法访问div。请帮帮我怎么做。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

这不起作用的原因可能是因为FindControl()方法不是递归。这在MSDN documentation

中被调出
  

仅当控件直接包含在指定容器中时,此方法才会找到控件;也就是说,该方法不会在控件中的控件层次结构中进行搜索。

因此,例如,Page.FindControls()只会 搜索Page.Controls集合中列出的控件;它不会搜索每个控件的Controls集合。因此,Page.FindControl()仅在ProductMenu位于您的ASPX页面的顶级时才有效;如果它嵌套在例如Panel控件中,则此代码将无效。

要解决此问题,您可以编写快速递归函数来爬网控制树。例如:

  public Control FindControl(Control control, string name) {
    foreach (Control childControl in control.Controls) {
      if (childControl.Id == name) return childControl;
      Control foundControl = FindControl(childControl, name);
      if (foundControl != null) return childControl;
    }
    return null;
  }

在您的情况下,假设您始终在寻找HtmlContainerControl的实例,您甚至可以验证类型并返回强类型对象,如果您选择。或者,如果您需要重复执行此操作,可以将其作为扩展方法添加到Page类,以便在多个页面上轻松访问。