Взгляните на эту страницу MSDN, в которой обсуждаются CompositeControls , в частности, раздел под названием «Механизм рендеринга составных элементов управления»
обработка запросов
код (в классе Page) звонки
EnsureChildControls непосредственно перед
запуск события PreRender на странице
и каждый дочерний элемент управления.
Во время обычного запроса ASP.NET метод CreateChildControls (), который вы переопределяете в CompositeControl, не вызывается, пока не достигнет поздней стадии жизненного цикла запроса, прямо перед PreRender. Если вы пытаетесь визуализировать CompositeControl вне обычного жизненного цикла страницы ASP.NET, то дочерние элементы управления никогда не будут добавлены, потому что никогда не вызываются методы создания дочерних элементов управления. Лучший способ гарантировать, что EnsureChildControls () вызывается при ручной визуализации элемента управления, это переопределить RenderControl (), например, так:
public override void RenderControl(HtmlTextWriter writer)
{
// We must explicitly call EnsureChildControls() in cases where we are rendering
// a CompositeControl outside of the normal ASP.NET page lifecycle
EnsureChildControls();
base.RenderControl(writer);
}
Мне кажется странным, что сам класс CompositeControl уже не переопределяет метод RenderControl () аналогичным образом. Если вы используете Reflector для изучения деталей реализации CompositeControl, вы увидите, что все методы, переопределенные в классе, сделаны исключительно для вызова EnsureChildControls (); даже Render () вызовет метод EnsureChildControls (), если элемент управления находится в режиме разработки. От отражателя:
protected internal override void Render(HtmlTextWriter writer)
{
if (base.DesignMode)
{
this.EnsureChildControls();
}
base.Render(writer);
}