ASP.NET WebControl и рендеринг содержащихся потомков

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

Я знаю, что мне нужно настроить класс с этими двумя флагами:

[ParseChildren(false)]
[PersistChildren(true)]
public class OuterControl : WebControl
{
  ...
}

И примерная разметка будет выглядеть так:

<custom:OuterControl>
  <asp:TextBox ...>
<custom:OuterControl>

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

protected override void RenderContents(HtmlTextWriter output)
{
  EnsureChildControls();
  [ Misc work, render my controls ]

  [** Would like to render wrapped children here **]

  [ Possibly other misc work ]
}

Как уже говорилось, я могу либо заставить свои элементы управления, созданные в коде, отображать дважды при вызове RenderChildren (), либо обернутые элементы управления вообще не отображать, удалив эту строку. Штопать.

Мысли?


person Overflew    schedule 05.11.2009    source источник


Ответы (1)


Когда у меня возникло подобное требование (создание стандартного набора элементов управления на основе предоставленных элементов управления), я в итоге сделал что-то вроде этого:

EnsureChildControls();

Control[] currentControls = new Control[Controls.Count];

if (HasControls()) {
  Controls.CopyTo(currentControls, 0);
  Controls.Clear();
}

// Misc work, add my controls, etc, e.g.
Panel contentBox = new Panel { ID = "Content", CssClass = "content_border" };
// at some point, add wrapped controls to a control collection
foreach (Control currentControl in currentControls) {
  contentBox.Controls.Add(currentControl);
}

// Finally, add new controls back into Control collection
Controls.Add(contentBox);

Который неплохо зарекомендовал себя.

person Zhaph - Ben Duguid    schedule 05.11.2009