Динамические элементы управления страницами ASP.NET: возможно ли связывать события ПОСЛЕ Page.Load? - PullRequest
0 голосов
/ 26 ноября 2008

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

У меня есть элемент таблицы

, который я динамически создаю аналогично этому коду:
' 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). Я хочу не делать двойной пост, чтобы обновлять резюме, любые мысли полезны.

Ответы [ 3 ]

1 голос
/ 26 ноября 2008

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

Удачи!

1 голос
/ 28 ноября 2008

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

0 голосов
/ 26 ноября 2008

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

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

...