2010-01-12 5 views
3

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

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

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; 
     } 

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

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

+2

Динамические элементы управления должны быть воссозданы при каждой обратной передаче, это хорошая ссылка о том, как сохранять динамические элементы управления и их состояние. http://www.singingeels.com/Articles/Dynamically_Created_Controls_in_ASPNET.aspx –

+0

@Richard, +1, потому что это единственный способ сделать эту работу. Вы должны были ответить на этот вопрос вместо комментария. –

ответ

7

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

+0

ссылка не работает – Toolkit

1

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

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

Если вы хотите получить доступ к своему управлению в 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(); 
    } 
2

Создайте ваш контроль в Page_Init. Затем сделайте его видимым на вашем Button_Click событии.


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

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

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

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

Init

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

.

нагрузки

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

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