Заполнители не создаются при программном добавлении элементов управления - PullRequest
4 голосов
/ 09 июля 2009

У меня есть страница ASPX с объявленным элементом управления Placeholder.

В Codebehind я создаю UserControl и добавляю его в Placeholder.

protected void Page_Load(object sender, EventArgs e)
{
      UserControl uc = new ChartUserControl();
      myForm.Controls.Add(uc);
}

UserControl, в свою очередь, имеет Placeholder, но в Page_Load (для UserControl), когда я делаю:

protected void Page_Load(object sender, EventArgs e)
{
    WebControl x = new WebControl();
    userControlPlaceholder.Controls.Add(x);
}

Это дает мне повсеместное исключение "Ссылка на объект не установлена ​​для экземпляра объекта".

Я пытался форсировать создание экземпляра, вызывая конструктор, но это привело меня к другим неприятностям. Любая помощь будет оценена.

Ответы [ 2 ]

9 голосов
/ 09 октября 2009

Я просто потратил 4 часа на это сам.

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

ChartUserControl chart = new ChartUserControl();

но вы должны использовать LoadControl:

ChartUserControl chart =
   (ChartUserControl)LoadControl("~/path/to/control/ChartUserControl.ascx");

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

2 голосов
/ 09 июля 2009

Вместо добавления элемента управления в Page_Load переопределите метод CreateChildControls и добавьте его туда.

...