4

本当にシンプルなテンプレートコントロールを作成しようとしています。これまでに行ったことはありませんが、過去に作成したコントロールの多くは、テンプレート機能を含めると非常に役立つことを知っています。そのため、現在学習しています。

私が抱えている問題は、テンプレートがページに出力されているのに、プロパティ値が出力されていないことです。したがって、取得するのは、テンプレートに含める静的テキストだけです。

コントロールがエラーを引き起こさないので、私は何かを正しくしているに違いありません。それで、それは私のパブリックプロパティが存在することを知っています。(たとえば、Container.ThisDoesntExistを使用しようとすると、例外がスローされます)。

私はこれについていくつかの助けをいただければ幸いです。私は完全なマペットであり、何かが欠けているだけかもしれません。単純なテンプレート化されたサーバーコントロールに関するオンラインチュートリアルはほとんどないように思われるので、知っている場合はそれについて知りたいと思います。

私のコードの縮小版を以下に示します。

どうもありがとう、ジェームズ

コントロールのコードは次のとおりです。

[ParseChildren(true)]
public class TemplatedControl : Control, INamingContainer
{
    private TemplatedControlContainer theContainer;

    [TemplateContainer(typeof(TemplatedControlContainer)), PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate ItemTemplate { get; set; }

    protected override void CreateChildControls()
    {
        Controls.Clear();

        theContainer = new TemplatedControlContainer("Hello World");

        this.ItemTemplate.InstantiateIn(theContainer);

        Controls.Add(theContainer);
    }
}

コンテナのコー​​ドは次のとおりです。

[ToolboxItem(false)] 
public class TemplatedControlContainer : Control, INamingContainer
{
    private string myString;

    public string MyString
    {
        get
        {
            return myString;
        }
    }

    internal TemplatedControlContainer(string mystr)
    {
        this.myString = mystr;
    }
}

これが私のマークアップです:

<my:TemplatedControl runat="server">
    <ItemTemplate>
        <div style="background-color: Black; color: White;">
            Text Here: <%# Container.MyString %>
        </div> 
    </ItemTemplate>
</my:TemplatedControl>
4

1 に答える 1

1

コントロールで DataBind メソッドを呼び出す必要があります。

1 つの可能性は、CreateChildControls() メソッドに DataBind 呼び出しを追加することです。

保護されたオーバーライド void CreateChildControls() { Controls.Clear();

    theContainer = new TemplatedControlContainer("Hello World");

    this.ItemTemplate.InstantiateIn(theContainer);

    Controls.Add(theContainer);

    this.DataBind();

}
于 2010-04-09T16:07:43.803 に答える