1
ASP.NETテンプレートシステムを使用するコンポジットコントロールを使用しています。テンプレート化されたASP.NETコントロールの作成
私のマークアップでHeaderTemplateとFooterTemplateを定義し、その間にusercontrolをプログラムで追加できます。
私が目指してるのマークアップは、このようなものです:
<asp:DropZone runat="server" ID="LeftZone">
<HeaderTemplate>
<h1>Getting started</h1>
</HeaderTemplate>
<FooterTemplate>
<h3>The end of it...</h3>
</FooterTemplate>
</asp:DropZone>
マイドロップゾーンクラスは、次のようになります。
public class DropZone : Control, INamingContainer
{
private ITemplate headerTemplate;
private ITemplate footerTemplate;
[DefaultValue((string)null), Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateInstance(TemplateInstance.Single)]
public virtual ITemplate HeaderTemplate
{
get { return headerTemplate; }
set { headerTemplate = value; }
}
[DefaultValue((string)null), Browsable(false), PersistenceMode(PersistenceMode.InnerProperty), TemplateInstance(TemplateInstance.Single)]
public ITemplate FooterTemplate
{
get { return footerTemplate; }
set { footerTemplate = value; }
}
protected override void OnInit(EventArgs e)
{
EnsureChildControls();
base.OnInit(e);
}
private void AppendTemplate(ITemplate template, Control container)
{
if (template == null) return;
var ph = new PlaceHolder();
container.Controls.Add(ph);
template.InstantiateIn(ph);
}
protected override void CreateChildControls()
{
Controls.Clear();
AppendTemplate(HeaderTemplate, this);
Control helloWorld = Page.LoadControl("~/WebParts/HelloWorld.ascx");
if (helloWorld != null)
{
Controls.Add(helloWorld);
}
AppendTemplate(FooterTemplate, this);
ChildControlsCreated = true;
base.CreateChildControls();
}
}
ITemplateフィールドがインスタンス化されることはありませんしかし、これは動作しません。 。
ご迷惑をおかけして申し訳ございません。
ありがとうございました。
更新:私は、カスタムコントロールをCompositeControlから派生させて、正常に機能するようにしなければなりませんでした。
ありがとうございます。どうやら、Controlの代わりにCompositeControlからDropZoneコントロールを派生させる必要があります。今はすべてが期待通りに機能します。 –
ああ、そうです。 CompositeControlはあなたの友人です。 –
複合コントロールの代わりにINamingContainerを実装することもできます。ユニークなIDが確実に出力されるようにするマーカーテンプレートです。 CompositeControlがこれを実行します。そのため、これが機能します。 –