ASP.NET - доступ к элементам управления на дочерней странице

У меня есть мастер-страница, там только один пункт меню и заполнитель контента. У меня есть другая веб-форма, наследующая от этой главной страницы. Как обычно, я поместил все свои элементы управления в Contentplaceholder. В событии Page_Load моей формы я хочу установить Enabled = false для всех элементов управления выпадающего списка. Для этого пишу:

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

Но все раскрывающиеся списки остаются включенными. Когда я проверяю счетчик Page.Control, я вижу только один элемент управления, и это элемент меню главной страницы формы. Что мне делать, чтобы получить список элементов управления в моей текущей форме?


person Mikayil Abdullayev    schedule 10.04.2012    source источник


Ответы (2)


ваш цикл 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 внутри себя.

person Imran Rizvi    schedule 10.04.2012

Вот код, который у меня сработал. Вы правы, элемент управления содержимым недоступен со страницы, поэтому вы используете код 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;
    }
}
person Eugene    schedule 10.04.2012
comment
И как мне получить контроль содержимого? Если это Content content = (Content) Page.FindControl (ContentMain); тогда это возвращает ноль. - person Mikayil Abdullayev; 10.04.2012
comment
Вы не можете назвать это по имени? Если он называется ContentMain, это будет ContentMain.Controls - person Eugene; 10.04.2012
comment
но когда я набираю ContentMain, он не отображается в меню intellisense. - person Mikayil Abdullayev; 10.04.2012