У меня есть сайт, над которым я сейчас работаю в ASP.NET 2.0, используя обычный материал WebForm и ASP.NET AJAX 1.0. Можно ли привязать событие к динамически создаваемому элементу управления после события Page.Load?
У меня есть элемент table <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). Я не хочу делать двойной пост, чтобы обновить сводку, любые мысли полезны.





Вы должны добавить элементы управления перед Page.Load, чтобы поддерживать ViewState между обратными передачами, поэтому используйте для этого обработчик событий OnInit.
Но как только они будут добавлены, вы сможете привязать обработчики событий (например, OnClick) в любой момент во время или после Page.Load ... например, в ItemDataBound вашей сетки (или что-то в этом роде) или в Page.PreRender .
Я также не использую состояние просмотра для этих элементов управления, они генерируются при каждой загрузке страницы, поскольку данные меняются с 90% обратных передач, нет необходимости сохранять в этой ситуации.
Вам необходимо отправить обратно всю страницу после того, как ваши данные изменятся в «событии btnClick в другом месте на странице». Похоже, у вас есть UpdatePanel, и похоже, что это перехватывает обратную передачу вашего обработчика событий btnClick. Поместите btnClick за пределы UpdatePanel или измените его триггеры, чтобы ваш btnClick принудительно выполнял обратную передачу / обновление ваших данных. Или измените дизайн своей таблицы, чтобы она обновлялась AJAXly, когда вы нажимаете на btnClick, трудно получить более подробную информацию, не зная больше о структуре вашей страницы и элементах управления.
Удачи!
Вот что я сделал: я сохранил записи, а затем сделал Server.Transfer на ту же страницу, чтобы повторно сгенерировать сводный раздел - это своего рода хакерский прием, но он работает и не требует двойной обратной передачи (однако страница цикл выполняется дважды с помощью этого метода).
Вы можете привязаться к событию, когда захотите. В конце концов, это просто событие. Но не все места могут быть подходящими, потому что вы должны учитывать, когда начинается событие. И в большинстве случаев это происходит между Page_Load и Page_PreRender. Это включает событие щелчка на LinkButton. В общем, я бы рекомендовал добавлять ваши динамически создаваемые элементы управления на этапе Page_Init.
Моя самая большая проблема - текущие данные, которые мне нужно отображать, доступны только после Page.Load.