Как установить свойства пользовательского элемента управления до его рендеринга?

У меня есть пользовательский элемент управления (uc) на странице. uc предоставляет некоторые свойства, которые устанавливаются в событии Page_Load () родительской страницы, и их следует читать во время загрузки пользовательского элемента управления.

Похоже, что Page_Load () uc срабатывает до того, как какие-либо свойства будут установлены с родительской страницы.

В каком событии я должен установить свойства uc, чтобы он мог использовать эти свойства при визуализации?

Я использую ASP.NET 3.5 и C #

p.s. я только что откопал решение из своего старого кода:

в Page_Load элемента управления выполните:

Page.LoadComplete += delegate { LoadTheControl(); };

Я все же хотел бы услышать твои идеи.


person roman m    schedule 24.09.2009    source источник


Ответы (5)


Получить доступ к свойству OnPreRender можно без всяких уловок.

person rick schott    schedule 25.09.2009

Я ПРОСТО столкнулся с этой проблемой сегодня днем.

Я создал общедоступный метод в UserControl под названием LoadData () и вызвал его из Page_Load моей страницы хостинга после установки свойства, от которого зависят данные.

Добавлено - пример кода

В пользовательском элементе управления:

public property SomeProp {get, set};

public void LoadData()
{
   // do work
}

и в Page_Load на странице хостинга

myControl.SomeProp = 1;
myControl.LoadData();
person David    schedule 24.09.2009
comment
я думаю, у меня было такое же решение (+1) - person roman m; 25.09.2009

Если вы декларативно размещаете элемент управления пользователя на странице, просто установите там свойство.

<cc1:myUserControl MyProperty="1" />

Если вы добавляете элементы управления на страницу динамически, просто установите свойство перед добавлением элемента управления в коллекцию элементов управления страницы размещения. Ни одно из событий жизненного цикла элемента управления не сработает, пока вы не вызовете Page.Controls.Add(myUserControl).

Если невозможно избежать настройки, которая у вас есть прямо сейчас, и родитель должен выполнить некоторую логику в Page_Load, а UC уже должен быть там, тогда я бы предложил то, что опубликовал Дэвид Стрэттон, но, по моему опыту, это обычно стандартизовано называться Initialize() или Init().

person womp    schedule 25.09.2009

Ну, ни один из ответов мне не поможет. Но при установке вручную свойств на событие InitComplete () все работает нормально. Мой пользовательский элемент управления теперь был включен для чтения свойства ПОСЛЕ того, как я установил свойство не раньше.

person Charles    schedule 17.07.2012

Я столкнулся с подобной проблемой: -

Сначала я динамически добавляю UserControl, а затем пытаюсь присвоить значения внутренним элементам управления элемента управления (текстовое поле в пользовательском элементе управления). Используя любое событие, такое как INIT или LOAD, элемент управления выдает мне исключение нулевой ссылки, поскольку, как видно из пошагового выполнения кода, элементы управления еще не созданы.

Позже я обнаружил, что эта проблема возникает только в том случае, если я объявляю элемент управления с помощью оператора dim;

Dim MyControl as new MyUserControl
Me.Panel1.Controls.add(MyControl)
MyControl.SetLabelText("My Name") 'Uses a method to set the label text on load.

С другой стороны, если я использую элемент управления следующим образом, он работает нормально:

Dim MyControl as MyUserControl = LoadControl("MyUserControl.ascx")
Me.Panel1.Controls.add(MyControl)
MyControl.SetLabelText("My Label Text")
person gouderadrian    schedule 20.11.2012