Перехват событий из динамически добавленных пользовательских элементов управления ASP.NET

У меня есть веб-форма ASP.NET, в которую я добавляю переменное число пользовательских элементов управления. У меня две проблемы:

  1. Пользовательские элементы управления добавляются в PlaceHolder на форме в первом событии PageLoad (я добавляю их только когда "(! This.IsPostback)", но затем, когда форма отправляется обратно, элементы управления исчезают. Это нормально? другие элементы управления в форме сохраняют свое состояние, я ожидаю, что эти динамически добавленные элементы также останутся в форме. Нужно ли добавлять их для каждой обратной передачи?

  2. У меня также есть кнопка и обработчик события для события нажатия кнопки, но этот обработчик события никогда не вызывается, когда я нажимаю на кнопку. Что-то особенное, что я должен сделать, чтобы ловить события на динамически добавленных элементах управления?

6 ответов

Решение
  1. Да, вам нужно добавлять их в каждый постбэк.
  2. Да... элемент управления должен находиться в иерархии элементов управления до того, как asp.net отправит событие (т.е. создайте динамические элементы управления как можно раньше на жизненном цикле страницы).

Я столкнулся с подобной проблемой. У меня была страница, на которой отображалась коллекция пользовательских веб-элементов управления. Мое решение состояло в том, чтобы добавить дополнительный невидимый веб-элемент управления, чтобы при нажатии кнопки добавить другой элемент управления, который я бы просто использовал невидимый. Затем при обратной отправке моя функция загрузки добавит еще один невидимый элемент управления в коллекцию.

  1. Для этого добавьте свои элементы управления при инициализации страницы вместо загрузки страницы. (повторно добавить при обратной передаче)
  2. Вам нужно знать идентификатор добавленных кнопок, чтобы привязать их к событию.

Вчера я понял, что вы можете заставить ваше приложение работать как обычно, загрузив дерево элементов управления сразу после запуска 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;
}
Другие вопросы по тегам