创建一个简单的模板控件。有问题

时间:2010-04-08 10:19:57

标签: c# asp.net templates custom-server-controls servercontrols

我正在尝试创建一个非常简单的模板化控件。我之前从未这样做过,但我知道如果我包含模板能力,我过去创造的很多控件都会大大受益 - 所以我现在正在学习。

我遇到的问题是我的模板在页面上输出但我的属性值不是。所以我得到的是我在模板中包含的静态文本。

我必须正确地做某事,因为控件不会导致任何错误,所以它知道我的公共属性存在。 (例如,如果我尝试使用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>

1 个答案:

答案 0 :(得分:1)

你应该在你的控件上调用方法DataBind。

一种可能性是在CreateChildControls()方法中添加DataBind调用:

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

    theContainer = new TemplatedControlContainer("Hello World");

    this.ItemTemplate.InstantiateIn(theContainer);

    Controls.Add(theContainer);

    this.DataBind();

}