У меня есть веб-страница с GridView. GridView содержит список объектов вопросов. У каждого вопроса есть тип вопроса. Когда пользователь щелкает элемент управления «Вопрос», появляется модальное всплывающее окно Ajax, содержащее настраиваемый веб-элемент управления Dialog. Веб-элемент управления Dialog предназначен для инкапсуляции дочернего настраиваемого веб-элемента управления вместе с кнопками ОК и Отмена. В этом сценарии дочерний элемент управления - это настраиваемый элемент управления «Вопрос», представляющий выбранный вопрос. Точный тип элемента управления «Вопрос» неизвестен, пока не будет нажата строка в GridView.
Подводя итог иерархии страниц:
- Страница
- GridView, содержащий вопросы (объявленный в разметке .aspx, запускает событие при щелчке строки)
- Панель связана с модальным расширителем всплывающих окон AJAX (объявленным в разметке .aspx)
- Элемент управления диалогом (объявлен в разметке .aspx)
- Элемент управления вопросом (создается динамически в элементе управления Dialog, тип не известен, пока не будет выбран вопрос)
- Кнопка ОК (создается динамически в элементе управления Dialog)
- Кнопка отмены (создается динамически в элементе управления Dialog)
Когда пользователь нажимает кнопку ОК в диалоговом окне, я хочу получить доступ к содержимому диалогового окна с содержащей его страницы. (В различных элементах управления Вопросом есть код, который проверяет ответ, и свойство в диалоговом окне, которое предоставляет ответ на содержащую страницу.)
У меня были большие проблемы с тем, чтобы заставить это работать.
Я часами гуглил, и во всех статьях о настраиваемых веб-элементах управления говорится, что вам нужно создавать дочерние элементы управления в переопределении OnInit. Однако в моем сценарии метод Dialog OnInit вызывается до того, как GridView запускает событие щелчка по строке, что означает, что я не могу создать элемент управления Question, потому что я не знаю целевой тип.
Я могу сделать так, чтобы он, по крайней мере, отображал динамический элемент управления вопросом, если переместил код, который его создает, на более позднюю точку жизненного цикла диалога, например. RenderContents. Однако это неверно согласно всем статьям и в любом случае бесполезно, потому что элемент управления все еще недоступен при нажатии кнопки ОК в диалоговом окне (поскольку диалоговое окно скрыто и RenderContents никогда не будет вызван).
Итак, я спрашиваю ребят из ASP.NET, как это должно быть сделано? Я не ищу код; просто стратегия. Как правильно это настроить? Целью является диалоговое окно, которое содержит динамически создаваемый элемент управления, тип которого зависит от выбранной строки в GirdView и к которому может получить доступ содержащаяся страница после обратной передачи.
Будем признательны за любые советы.
ОБНОВИТЬ
Я добавил ведение журнала, и порядок срабатывания событий после щелчка по сетке следующий:
- Страница ctor
- Диалог ctor
- Диалог OnInit
- Страница OnInit
- Страница CreateChildControls
- Диалог CreateChildControls
- Страница OnLoad
- Диалог OnLoad
- Страница OnContactorComplianceQuestionSelected
- Диалог RenderContents
Я знаю только, какой тип управления должен содержать диалог после Page OnContactorComplianceQuestionSelected.