Элементы управления динамической страницей ASP.NET: возможно ли привязать события ПОСЛЕ Page.Load?

У меня есть сайт, над которым я сейчас работаю в ASP.NET 2.0, используя обычный материал WebForm и ASP.NET AJAX 1.0. Можно ли привязать событие к динамически создаваемому элементу управления после события Page.Load?

У меня есть элемент таблицы ‹td›, который я динамически создаю аналогично этому коду:

' Create Link Button
lnk.ID = String.Format("lnkDetails_{0}", dr("Id"))
lnk.Text = dr("Name").ToString()
lnk.CommandArgument = dr("Id").ToString()
AddHandler lnk.Click, AddressOf DetailsLink_Click
cName.Controls.Add(lnk)

Этот код зацикливается для каждой строки в базе данных (и, конечно же, в таблицу добавляется больше ячеек, в том числе ImageButton с событием. События работают безупречно, когда я выполняю этот код во время событий, ведущих к Page.Load включительно. . Мне нужно заполнить эту таблицу текущими данными, которые обновляются во время события btnClick в другом месте страницы, которое происходит после этого события Page_Load, поэтому я заполняю старые данные. Если я изменю этот код на Page.LoadComplete , события перестают работать.

Эти данные представляют собой сводное отображение различных компонентов приложения, таких как чье-то имя, которое при обновлении в форме «подробностей» обновляет базу данных путем частичной обратной передачи (требование), а затем необходимо отображать обновление в этом «сводке». 'после обновления. В настоящее время требуется 2 постбэка, чтобы увидеть изменения в разделе «Сводка», поэтому фактически сводка отстает от изменений на 1 шаг (ясно, как грязь?)

Каким будет лучший способ для меня заполнить эту таблицу текущими данными (которые доступны во время / после Page.LoadComplete), но по-прежнему иметь срабатывание события при нажатии ссылки (событие заставляет UpdatePanel отображать `` подробности '' форма).

У меня также есть jQuery и обычные методы ASP.NET AJAX, а также javascript является требованием для веб-сайта, поэтому мне не нужно переходить на использование неподдерживаемых браузеров.

Это мое первое веб-приложение ASP.NET, и мне нужна помощь в выяснении наилучшего способа сделать это (я хорошо разбираюсь в PHP, Django и обычных способах создания веб-форм - например, наличие нескольких форм на одной странице o_O).

Обновлять:

На самом деле нет хорошего способа привязать управляющие события к элементам управления после Page_Load. Общая архитектура страниц заключается в том, что существует одна форма ASP.NET, охватывающая всю страницу, есть только одна страница aspx. Я использую главные страницы (однако это не имеет очевидных последствий для моей проблемы).

Страница разделена на левую и правую «панель», левая - это сводка всех данных (на панели обновлений), правая «панель» имеет 6 «вкладок», каждая из которых реализована как отдельный пользовательский элемент управления, каждая с несколькими поля формы и кнопка обновления - все в собственном UpdatePanel.

При обновлении любой из этих вкладок обновляется только панель сводки (UpdatePanel.update()) и ее собственная панель. «Обновление» и привязка событий динамических элементов управления сводкой из базы данных происходит во время Page_Load, а событие кнопки «Обновить» обновляет данные базы данных. (Событие управления происходит после Page_Load). Я не хочу делать двойной пост, чтобы обновить сводку, любые мысли полезны.


person Bryan Rehbein    schedule 26.11.2008    source источник


Ответы (3)


После изменения данных в «событии btnClick в другом месте на странице» вам необходимо отправить обратно всю страницу. Похоже, у вас есть UpdatePanel, и похоже, что это перехватывает обратную передачу вашего обработчика событий btnClick. Поместите btnClick за пределы UpdatePanel или измените его триггеры, чтобы ваш btnClick принудительно выполнял обратную передачу / обновление ваших данных. Или измените дизайн своей таблицы так, чтобы она обновлялась AJAXly, когда вы нажимаете на btnClick, трудно получить более подробную информацию, не зная больше о структуре вашей страницы и элементах управления.

Удачи!

person Ricardo Villamil    schedule 26.11.2008
comment
Вот что я сделал: я сохранил записи, а затем сделал Server.Transfer на ту же страницу, чтобы повторно сгенерировать сводный раздел - это своего рода хакерский прием, но он работает и не требует двойной обратной передачи (однако страница цикл выполняется дважды с помощью этого метода). - person Bryan Rehbein; 10.12.2008

Вы можете привязаться к событию, когда захотите. В конце концов, это просто событие. Но не все места могут быть подходящими, потому что вы должны учитывать, когда начинается событие. И в большинстве случаев это происходит между Page_Load и Page_PreRender. Это включает событие щелчка на LinkButton. В общем, я бы рекомендовал добавлять ваши динамически создаваемые элементы управления на этапе Page_Init.

person Vilx-    schedule 28.11.2008

Вы должны добавить элементы управления перед Page.Load, чтобы поддерживать ViewState между обратными передачами, поэтому используйте для этого обработчик событий OnInit.

Но как только они будут добавлены, вы сможете привязать обработчики событий (например, OnClick) в любой момент во время или после Page.Load ... например, в ItemDataBound вашей сетки (или что-то подобное) или в Page.PreRender .

person Kon    schedule 26.11.2008
comment
Моя самая большая проблема заключается в том, что текущие данные, которые мне нужно отображать, доступны только после Page.Load. - person Bryan Rehbein; 26.11.2008
comment
Я также не использую состояние просмотра для этих элементов управления, они генерируются при каждой загрузке страницы, так как данные меняются с 90% обратных передач, нет необходимости сохранять в этой ситуации. - person Bryan Rehbein; 26.11.2008