Перехват событий из динамически добавленных пользовательских элементов управления ASP.NET
У меня есть веб-форма ASP.NET, в которую я добавляю переменное число пользовательских элементов управления. У меня две проблемы:
Пользовательские элементы управления добавляются в PlaceHolder на форме в первом событии PageLoad (я добавляю их только когда "(! This.IsPostback)", но затем, когда форма отправляется обратно, элементы управления исчезают. Это нормально? другие элементы управления в форме сохраняют свое состояние, я ожидаю, что эти динамически добавленные элементы также останутся в форме. Нужно ли добавлять их для каждой обратной передачи?
У меня также есть кнопка и обработчик события для события нажатия кнопки, но этот обработчик события никогда не вызывается, когда я нажимаю на кнопку. Что-то особенное, что я должен сделать, чтобы ловить события на динамически добавленных элементах управления?
6 ответов
- Да, вам нужно добавлять их в каждый постбэк.
- Да... элемент управления должен находиться в иерархии элементов управления до того, как asp.net отправит событие (т.е. создайте динамические элементы управления как можно раньше на жизненном цикле страницы).
Я столкнулся с подобной проблемой. У меня была страница, на которой отображалась коллекция пользовательских веб-элементов управления. Мое решение состояло в том, чтобы добавить дополнительный невидимый веб-элемент управления, чтобы при нажатии кнопки добавить другой элемент управления, который я бы просто использовал невидимый. Затем при обратной отправке моя функция загрузки добавит еще один невидимый элемент управления в коллекцию.
- Для этого добавьте свои элементы управления при инициализации страницы вместо загрузки страницы. (повторно добавить при обратной передаче)
- Вам нужно знать идентификатор добавленных кнопок, чтобы привязать их к событию.
Вчера я понял, что вы можете заставить ваше приложение работать как обычно, загрузив дерево элементов управления сразу после запуска loadviewstateevent. если вы переопределите событие loadviewstate, вызовите mybase.loadviewstate и затем поместите свой собственный код для регенерации элементов управления сразу после него, значения для этих элементов управления будут доступны при загрузке страницы. В одном из моих приложений я использую поле viewstate для хранения идентификатора или информации о массиве, которую можно использовать для воссоздания этих элементов управления.
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
MyBase.LoadViewState(savedState)
If IsPostBack Then
CreateMyControls()
End If
End Sub
1) Вы должны добавить элементы управления в Pre-init ( жизненный цикл страницы)
2) Вы должны прикрепить обработчик событий к событию созданной кнопки (события могут произойти намного позже в жизненном цикле страницы, чем те же события для элементов управления, созданных декларативно)
Я столкнулся с той же самой проблемой и боролся как 5-6 часов. Я пишу это, может быть, кто-то вроде меня мог бы получить помощь.
1) Вы должны инициализировать свои элементы управления в событии Page.PreInit. (В моем случае мне пришлось добавить свои элементы управления в заполнитель, поэтому я расширил PreInit, чтобы загружать эти элементы управления раньше, но вам не нужно этого делать. Это зависит от вашего сценария.)
2) Вы должны связать эти точные методы с вашими элементами управления после того, как вы инициализируете их в своем событии Page.PreInit.
Вот мой пример кода:
protected override void OnPreInit(EventArgs e)
{
// Loading controls...
this.PrepareChildControlsDuringPreInit();
// Getting ddl container from session and creating them...
if (GetDDLSession().Count != 0)
{
foreach (DropDownList ddl in GetDDLSession())
{
ddl.SelectedIndexChanged += SelectedIndexChanged;
phDropDowns.Controls.Add(ddl);
}
}
base.OnPreInit(e);
}
public static void PrepareChildControlsDuringPreInit(this Page page)
{
// Walk up the master page chain and tickle the getter on each one
MasterPage master = page.Master;
while (master != null) master = master.Master;
}