在asp.net中创建自定义模板化控件

时间:2012-01-28 20:58:57

标签: c# asp.net webforms controls

我想创建自定义模板控件,控制模板内部的控件coluld进入页面(类似于updatepanel的行为)。所以,更详细的问题。 控件必须如下所示:

<ec:TabControl runat="server" ID="tab">
    <Tabs>
        <ec:Tab runat="server">
            <TabContainer>
                <asp:Button runat="server" Text="aaaaaa" />
            </TabContainer>
            <TabName>
                text or controls
            </TabName>
        </ec:Tab>
        <ec:Tab runat="server">
            <TabContainer>
                <asp:Button runat="server" Text="vcxvxvxv" />
            </TabContainer>
            <TabName>
                some text
            </TabName>
        </ec:Tab>
    </Tabs>
</ec:TabControl>

当数据绑定控制运行时,它的运行方式很好。换句话说,在ondatabound阶段,内部和模板的所有控件都被适当地实例化。 但我真正想要的是访问内部和直接从页面(通过ID)控件。例如,您可以使用updatepanel(页面范围内的可用内容)来执行此操作。

下面你可以看到控件的源代码片段:

public class Tab
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateContainer(typeof(HtmlAnchorContainer))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ITemplate TabName { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    [TemplateContainer(typeof(PanelContainer))]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ITemplate TabContainer { get; set; }
}

public class TabControl : System.Web.UI.WebControls.WebControl
{
    List<Tab> tabs;
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content),
    PersistenceMode(PersistenceMode.InnerProperty),
    NotifyParentProperty(true)]
    public List<Tab> Tabs
    {
        get { return tabs ?? new List<Tab>(); }
        set { tabs = value; }
    }

    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        .....
        foreach (Tab tabItem in Tabs)
        {
            //generating tree control for further rendering
        }
        ...
    }

    protected override void OnDataBinding(EventArgs e)
    {
        EnsureChildControls();
        base.OnDataBinding(e);
    }
 }

希望您提供建议,建议,链接和建设性批评。))

1 个答案:

答案 0 :(得分:0)

申请:

[TemplateInstance(TemplateInstance.Single)]

声明你想要直接引用控件的模板,然后解决这个问题。