Проблема с доступом к usercontrol в другом наполнителе контента из другого usercontrol - PullRequest
0 голосов
/ 25 августа 2011

Теперь я знаю, что это не подходит для хорошей практики проектирования, однако это устаревший код с ошибкой, которую необходимо исправить, поэтому мне придется с этим смириться.

Сценарий таков: у меня есть набор главных страниц гнезда (глубиной 3), назовите их Base> Template> 2Col. Я работаю на уровне 2Col. Как следует из названия, главная страница 2Col содержит два заполнителя содержимого: MainContent и SideContent.

У меня есть пользовательский элемент управления в MainContent, который должен ссылаться на другой пользовательский элемент управления в SideContent.

ContentPlaceHolder ph = (ContentPlaceHolder)this.Page.Master.FindControl("SideContent");
MyUserControl uc = (MyUserControl )ph.FindControl("MyUserControl1");

Я не уверен, почему это не сработает. Интеллектуальный смысл при отладке заставит меня думать, что ContentPlaceHolder есть, но первая строка всегда возвращает ноль?

Заранее спасибо!

1 Ответ

2 голосов
/ 25 августа 2011

Из-за вложения главных страниц вам необходим доступ к правильной главной странице, например, так:

ContentPlaceHolder ph = (ContentPlaceHolder)Parent.Parent.FindControl("SideContent");

В качестве альтернативы, если вам нужно найти какой-либо элемент управления на странице от мастера, используйте следующее:

ContentPlaceHolder ph = (ContentPlaceHolder)FindControl(Page.Master, "SideContent");

...

private Control FindControl(Control parent, string id)
{
    foreach (Control child in parent.Controls)
    {
        string childId = string.Empty;
        if (child.ID != null)
        {
            childId = child.ID;
        }

        if (childId.ToLower() == id.ToLower())
        {
            return child;
        }
        else
        {
            if (child.HasControls())
            {
                Control response = FindControl(child, id);
                if (response != null)
                    return response;
            }
        }
    }

    return null;
}
...