カスタムサーバーコントロールに内部コントロールを持つことは可能ですか?
質問
次のようなことができるようになりたい:
<ui:Tab Title="A nice title">
<TabTemplate>
<asp:Literal runat="server" ID="SetMe">With Text or Something</asp:Literal>
</TabTemplate>
</ui:Tab>
ただし、できること:
<ui:Tab Title="A nice title">
<TabTemplate>
<asp:DataList runat="server" ID="BindMe"></asp:DataList>
</TabTemplate>
</ui:Tab>
最終的に思いついた応答コード:
[ParseChildren(true)]
public class Node : SiteMapNodeBaseControl, INamingContainer
{
private ITemplate tabTemplate;
[Browsable(false),
DefaultValue(null),
Description("The tab template."),
PersistenceMode(PersistenceMode.InnerProperty),
TemplateContainer(typeof(TabTemplate))]
public ITemplate TabTemplate
{
get { return tabTemplate; }
set { tabTemplate = value; }
}
protected override void CreateChildControls()
{
if (TabTemplate != null)
{
Controls.Clear();
TabTemplate i = new TabTemplate();
TabTemplate.InstantiateIn(i);
Controls.Add(i);
}
}
protected override void Render(HtmlTextWriter writer)
{
EnsureChildControls();
base.Render(writer);
}
}
public class TabTemplate : Control, INamingContainer
{
}
解決
ParseChildren属性は、コントロールの子をプロパティとして扱うかコントロールとして扱うかを.NETに指示します。最初の例では、子供をコントロールとして扱いたいので、追加します
[ ParseChildren(ChildrenAsProperties = false) ]
2番目の場合、ChildrenAsProperties = true、およびITemplate型のTabTemplateプロパティが必要です。その後、いくつかの配管作業が含まれます。このMSDNサンプルで説明しています。ただし、テンプレートが1つだけ必要な場合は、あまり価値がありません。
所属していません StackOverflow