ASP.NET - 访问子页面中的控件

时间:2012-04-10 10:15:16

标签: asp.net controls master-pages

我有一个母版页,那里只有一个菜单项和一个contentplaceholder。我有另一个从该母版页继承的Web表单。我还把我的所有控件放在contentplaceholder中。在我的表单的Page_Load事件中,我想设置所有下拉列表控件的Enabled = false。为此,我写道:

       foreach (Control control in Page.Controls)
    {
        if (control is DropDownList)
        {
            DropDownList ddl = (DropDownList)control;
            ddl.Enabled = false;
        }
    }

但所有下拉列表仍为启用状态。当我检查Page.Control的计数时,我只看到一个控件,它是表单主页的menuitem。我该怎么做才能获得当前形式的控件列表?

2 个答案:

答案 0 :(得分:1)

这是适合我的代码。您是对的,无法从页面访问内容控件,因此您使用Master.FindControl ...代码。请务必将ContentPlaceHolderID参数插入Master.FindControl(“righthere”)表达式。

ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder)Master.FindControl("MainContent");
if(contentPlaceHolder != null)
{
    foreach (Control c in contentPlaceHolder.Controls)
    {
        DropDownList d = c as DropDownList;
        if (d != null)
            d.Enabled = false;
    }
}

答案 1 :(得分:1)

你的foreach循环不起作用,因为你的控件可以有子控件,他们也可以有子控件然后DDL。

我更喜欢的是首先创建一个控件列表,然后遍历该列表,该列表中填充了您想要的DDL控件。

public void FindTheControls(List<Control> foundSofar, Control parent) 
{
  foreach(var c in parent.Controls) 
  {
    if(c is IControl) //Or whatever that is you checking for 
    {
       if (c is DropDownList){ foundSofar.Add(c); } continue;

       if(c.Controls.Count > 0) 
       {
           this.FindTheControls(foundSofar, c);
       }
     }
  }  
}

稍后您可以直接遍历foundSofar,并确保它将包含其中的所有DDL控件。