Все динамически созданные элементы управления должны быть добавлены к концу страницы Page_Init (хотя иногда вы можете уйти с ними, добавив к концу страницы_Load).
Если вы только добавляете их на основе события нажатия кнопки, то вы сделали это в обработчиках событий, которые запускают AFTER Page_Init и Page_Load в жизненном цикле - вот почему ваши события не срабатывают и почему они работают отлично, когда вы добавляете во время разработки.
Это связано с тем, что при нажатии кнопки на втором пользовательском элементе управления снова начинается жизненный цикл всей страницы. Страница проходит через Page_Load и Page_Init сначала, и ваш контроль не загружается здесь. Таким образом, когда жизненный цикл страницы обрабатывает часть «события обратной связи», элемент управления больше не существует, поэтому событие не срабатывает.
И наоборот, когда вы добавляете во время разработки, элемент управления существует в Page_Init и Page_Load, поэтому он способен обрабатывать события обратной передачи из пользовательского элемента управления, поскольку он уже существует в дереве управления - если это имеет смысл.
Вам нужно подумать, как вы можете реструктурировать, чтобы они были добавлены к тому времени, когда страница_Load закончилась совсем недавно или она не будет работать. Без примеров кода или более подробностей трудно точно указать, как это сделать. Одна из возможностей заключалась бы в том, чтобы установить его видимым, а не загружать его прямо - но если элемент управления выполняет некоторую «тяжелую работу» при загрузке, например, в результате попадания базы данных или вызовов API, это может оказаться неприемлемым для вас.
Я сделал что-то подобное. Я сделал, чтобы загрузить некоторые элементы управления динамически на основе выбора из DropDownList
. Если у вас есть метод, который загружает контроль за вас, давайте назовем это LoadControls()
, то вы можете сделать что-то вроде этого:
DropDownList_Click {
ViewState("LoadControls") = true;
LoadControls()
}
Установив переменную ViewState, вы можете указать Page_Load загрузить элементы управления на будущих постбэков :
Page_Load {
if (ViewState("LoadControls") == "true")
{
LoadControls();
}
}
Это имеет эффект затем загружая управления на лету, когда событие произойдет первым, а затем в будущие времена в жизненном цикле.
Можете ли вы разместить код, пожалуйста? – Strillo
Не могли бы вы показать нам код, который вы используете. –
Какой код вам нужен? –