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

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

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

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

Ответы [ 6 ]

3 голосов
/ 23 декабря 2008
  1. Да, вам нужно добавлять их в каждый постбэк.
  2. Да ... элемент управления должен находиться в иерархии элементов управления, прежде чем asp.net отправит событие (т. Е. Создайте динамические элементы управления как можно раньше в жизненном цикле страницы).
0 голосов
/ 20 сентября 2013

Я столкнулся с точно такой же проблемой и пробежал 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;
}
0 голосов
/ 16 июля 2009

Вчера я понял, что вы можете заставить ваше приложение работать как обычно, загрузив дерево элементов управления сразу после запуска loadviewstateevent. если вы переопределите событие loadviewstate, вызовите mybase.loadviewstate и затем поместите свой собственный код для регенерации элементов управления сразу после него, значения для этих элементов управления будут доступны при загрузке страницы. В одном из моих приложений я использую поле viewstate для хранения идентификатора или информации о массиве, которую можно использовать для воссоздания этих элементов управления.

Protected Overrides Sub LoadViewState(ByVal savedState As Object)
    MyBase.LoadViewState(savedState)
    If IsPostBack Then
        CreateMyControls()
    End If
End Sub
0 голосов
/ 01 апреля 2009

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

0 голосов
/ 23 декабря 2008

1) Вы должны добавить элементы управления в Pre-init ( Жизненный цикл страницы )

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

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