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

问题描述 投票:1回答:1

我有一个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。请帮帮我怎么做。提前致谢。

c# asp.net user-controls
1个回答
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类中,以便在多个页面上轻松访问。

© www.soinside.com 2019 - 2024. All rights reserved.