Программно добавляем пользовательский элемент управления в ASP.NET - PullRequest
3 голосов
/ 12 января 2010

У меня есть пользовательский элемент управления, который должен загружать дочерний элемент управления при нажатии кнопки. Беда в том, что он должен запросить управление у другого класса.

Итак, в событии нажатия кнопки я вызываю функцию, чтобы получить контроль, и добавляю ее на страницу, например:

UserControl ctrl = ExampleDataProvider.GetControl(some params...);
myDetailPane.Controls.Add(ctrl);

Метод GetControl выглядит следующим образом:

public static UserControl GetControl(some params...)
        {
            ExampleDetailPane ctrl = new ExampleDetailPane();
            ctrl.Value = "12";
            ctrl.Comment = string.Empty;
            return ctrl;
        }

Это не работает из-за жизненного цикла страницы - запускается Page_Load дочернего элемента управления, и его элементы управления равны нулю.

Я знаю, что мой подход неверен и почему, но не знаю, как лучше это исправить! Может ли кто-нибудь помочь?

Ответы [ 4 ]

7 голосов
/ 12 января 2010

Динамические элементы управления необходимо создавать заново при каждой обратной передаче, эта Статья является хорошей ссылкой о том, как сохранить динамические элементы управления и их состояние.

2 голосов
/ 12 января 2010

Создайте свой элемент управления в Page_Init. Затем сделайте это видимым на вашем Button_Click событии.


(CTRL + C / CTRL + V из другого вопроса, на который я ответил на прошлой неделе):

Все, что должно поддерживаться между циклами страниц, должно быть объявлено в Page_Init, а не Page_Load.

Вся инициализация, например добавление обработчиков событий и добавление элементов управления, должна быть добавлена ​​во время инициализации, так как состояние сохраняется между циклами страницы. Обработка содержимого элементов управления и состояния представления должна выполняться в Load.

Проверьте также http://msdn.microsoft.com/en-us/library/ms178472.aspx.

Init

Повышается после инициализации всех элементов управления и любого скина Настройки были применены. Использовать этот событие для чтения или инициализации управления свойства.

.

Load

Страница вызывает метод события OnLoad на странице, то рекурсивно делает то же самое для каждого дочернего элемента управления, который делает то же самое для каждого своего ребенка контролирует до страницы и все элементы управления загружены.

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

1 голос
/ 12 января 2010

Если вы хотите получить доступ к своему элементу управления в PostBack или хотите связать Event, вы должны создать их в методе CreateChildControls ().

    private UserControl _uc = null;

/// <summary>
    /// Creates all controls.
    /// </summary>
    /// <remarks>All the controls must be created in this method for the event handler</remarks>
    protected override void CreateChildControls()
    {
        _uc = new UserControl ();

        this.Controls.Add(_uc);
        base.CreateChildControls();
    }
1 голос
/ 12 января 2010

Два возможных подхода:

  1. Имейте элемент управления на странице, но не загружайте ничего, пока они не нажмут на свою кнопку. Затем вы можете заполнить значения в элементе управления. Это имеет преимущество в том, чтобы быть в пределах жизненного цикла страницы. Обратите внимание, что вы всегда можете использовать настройку стиля «display: none» для элемента управления, в котором находится ваш пользовательский элемент управления. Затем, как часть кнопки OnClick для кнопки, вы можете открыть элемент div, делающий ваш элемент управления видимым.
  2. Вы можете открыть другое окно, хотя очевидно, что оно может быть заблокировано блокировщиками всплывающих окон.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...