2010-10-27 5 views
0

Я пытаюсь добавить элемент управления в рамках пользовательского элемента управления:ошибка при добавлении элемента управления в пользовательском элементе управления

 LinkButton l = new LinkButton(); 
     l.Text = "Test"; 
     l.OnClientClick = "TestClick"; 
     l.ID = "TestID"; 
     l.Page = Page; 
     Page.Controls.Add(l); 

я получаю эту ошибку при загрузке страницы:

необработанного исключение было создано во время выполнения текущего веб-запроса. Информация о происхождении и местоположении исключения может быть идентифицирована с использованием следа стека исключений ниже.

[InvalidOperationException: коллекция была изменена; операции перечисления не может выполнить.] System.Web.UI.ControlCollectionEnumerator.MoveNext() +8677726 System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter писатель, ICollection детей) +217 System.Web.UI.Control.RenderChildren (HtmlTextWriter writer) +8 System.Web.UI.Page.Render (HtmlTextWriter writer) +29 System.Web.UI.Control.RenderControlInternal (HtmlTextWriter writer, адаптер адаптера адаптера) +27 System.Web.UI.Control. RenderControl (HtmlTextWriter писатель, ControlAdapter адаптер) +100 System.Web.UI.Control.RenderControl (HtmlTextWriter писатель) +25 System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3060"

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

ответ

2

Вы должны убедиться, что контроль добавляется во время фазы PreInitpage's life cycle. В принципе, после того, как событие Init поднято, вы не должны изменять, какие элементы управления находятся в коллекции управления страницей.

+0

+1 Забыл о бит PreInit. –

2

Это происходит потому, что вы добавляете его к элементам управления в ПААГ, а не в ваш пользовательский элемент управления ...

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

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

Попробуйте это:

this.Controls.Add(l) 
1

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

More info here

+1

Заполнитель поможет определить, где находится элемент управления. Однако он не будет безопасным добавлять элементы управления слишком поздно в жизненный цикл страницы. – jball