2011-12-20 8 views
0

У меня есть пользовательский элемент управления ASP.NET с кнопкой, и я хочу добавить его на страницу, когда пользователь нажимает кнопку из другого пользовательского элемента управления. Я создал обработчик события для первого пользовательского элемента управления, чтобы обработать его со страницы и добавить второй пользовательский элемент управления на страницу. Все работает нормально, но кнопка второго пользовательского элемента управления не отвечает на событие.Загрузка пользовательского элемента управления ASP.NET во время выполнения

я помещаю второй контроль над RadAjaxPanel

Примечание: При добавлении второго пользовательского элемента управления во время разработки оборотный штраф.

+1

Можете ли вы разместить код, пожалуйста? – Strillo

+2

Не могли бы вы показать нам код, который вы используете. –

+0

Какой код вам нужен? –

ответ

3

Все динамически созданные элементы управления должны быть добавлены к концу страницы 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(); 
} 
} 

Это имеет эффект затем загружая управления на лету, когда событие произойдет первым, а затем в будущие времена в жизненном цикле.

+0

Я понимаю вас, мне нужно что-то вроде этого http://demos.telerik.com/aspnet-ajax/ajax/examples/common/loadingusercontrols/ defaultcs.aspx –

+0

Возможно, вы совсем близко - просто установите что-то в ViewState, чтобы отметить, что вам нужно загрузить элемент управления, а затем загрузить его в Page_Load, если для флага ViewState установлено значение true. – bgs264

+0

Большое спасибо! +1! Это очень помогло мне! – Mike

Смежные вопросы