В WebForms, почему мой анонимный обработчик событий не вызывается при добавлении после OnLoad?

У меня есть страница ASP.NET WebForms с несколькими кнопками, добавленными программно следующим образом:

    private void AddExportButton(Control control, Action clickAction) {
        LinkButton exportButton = new LinkButton {
            Text = "Export",
            EnableViewState = false /*Buttons will be recreated on each Postback anyway.*/
        };
        exportButton.Click += (sender, e) => clickAction();
        control.Controls.Add(exportButton);
    }

Теперь это работает, пока метод AddExportButton() вызывается по пути от метода OnLoad() или OnPreLoad(). Однако он не запускает действие обработчика, когда AddExportButton() вызывается из метода OnLoadComplete().

Я хотел бы добавить/создать кнопки также при вызове другого обработчика событий (из раскрывающегося списка). Это происходит только после OnLoad(), что сломает мой код.

Почему это так и как в этом случае использовать анонимные методы в качестве обработчиков событий?

Посмотрите эту замечательную памятку о жизненном цикле страниц ASP.NET Леона Андрианаривони для получения дополнительной информации о порядок создания страницы/элемента управления.


person Marcel    schedule 07.08.2013    source источник


Ответы (1)


В жизненном цикле страницы внутренний метод RaisePostBackEvent (который вызывает событие кнопки Click) возникает между OnLoad и OnLoadComplete. Если вы подождете до OnLoadComplete, чтобы добавить LinkButton и подключить его событие Click, то, очевидно, событие не будет вызвано: слишком поздно.

(Тот факт, что вы используете анонимный метод, не имеет значения.)

Можете ли вы добавить кнопку экспорта в .aspx, но установить для ее свойства Visible значение false, если вы не хотите, чтобы она отображалась?

person Michael Liu    schedule 09.08.2013
comment
Хм, проблема для меня в том, что нужно добавить несколько кнопок экспорта (и я делаю некоторые другие, дорогие вещи, о которых я не упомянул). Как уже говорилось, в зависимости от того, что пользователь нажимает на упомянутое раскрывающееся меню на определенной вкладке, я хочу добавить только подмножество этих кнопок. Сделать их невидимыми — это просто много работы без соответствующего результата. Таким образом, добавление должно быть реакцией на другое событие щелчка. Раньше сделать не могу, так как раньше событие клика вкладки не обрабатывалось. Имеет ли это смысл? - person Marcel; 13.08.2013
comment
Можете ли вы также опубликовать код обработчика событий раскрывающегося списка? (По крайней мере, та часть, которая добавляет кнопку.) - person Michael Liu; 13.08.2013
comment
Эта часть уже показана, хотя этот код скрыт под многими другими вызовами. Я понял ваш ответ и построил его именно так (создавая кнопку каждый раз в OnLoad (), и это работает. Все обработчики событий вызываются, как и ожидалось, а нежелательные не видны. - person Marcel; 13.08.2013