我正在寻找一个可以在其中容纳标记的WebControl,并自己动态创建子控件。我遇到的问题是我不能(还)将标记中的控件(参见下面的示例)与我创建的子控件分开。
我知道我需要用这两个标志来设置类:
[ParseChildren(false)]
[PersistChildren(true)]
public class OuterControl : WebControl
{
...
}
样本标记看起来像:
<custom:OuterControl>
<asp:TextBox ...>
<custom:OuterControl>
在 RenderContents()中,我有一些控件需要添加到控件树中,渲染,然后渲染包含在特定部分的标记中的控件。 E.g:
protected override void RenderContents(HtmlTextWriter output)
{
EnsureChildControls();
[ Misc work, render my controls ]
[** Would like to render wrapped children here **]
[ Possibly other misc work ]
}
如上所述,我可以让代码创建的控件在调用 RenderChildren()时呈现两次,或者通过删除该行来使包装的控件完全不呈现。织补。
思想?
答案 0 :(得分: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);
这很好。