Ajax Control Toolkit自定义Tab扩展器,用于关闭客户端选项卡

时间:2010-07-20 16:53:14

标签: c# ajaxcontroltoolkit tabcontainer tabpanel extender

我正在尝试编写一个可以修改AJAX控件工具包TabPanel的AJAX控件扩展器,以便TabPanel的标头在文本后面有一个图像,单击该图像时会隐藏选项卡使用客户端脚本的头文件(没有回发)。我还希望能够指定一个onClientClose函数,该函数在关闭选项卡时也会被调用。

我是ASP控件扩展器的新手,到目前为止,我已经按照ASP.NET网站上的[教程](http://www.asp.net/ajax/tutorials/creating-a-custom-ajax-control-toolkit-control-extender-cs“创建自定义AJAX控件工具包控件扩展器”)来创建自定义扩展。我称我的扩展程序为ClosableTabPanelExtender,我的扩展程序项目构建完成。我设置了一个测试网页,如下所示:

<asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" />
<asp:TabContainer ID="TabContainer1" runat="server">
    <asp:TabPanel ID="TabPanel0" runat="server">
        <HeaderTemplate>Tab 0</HeaderTemplate>
        <ContentTemplate>Hello!</ContentTemplate>
    </asp:TabPanel>
    <asp:TabPanel ID="TabPanel1" runat="server">
        <HeaderTemplate>Tab 1</HeaderTemplate>
        <ContentTemplate>Goodbye!</ContentTemplate>
    </asp:TabPanel>
</asp:TabContainer>
<cc1:ClosableTabPanelExtender ID="ClosableTabPanelExtender1" runat="server" 
    TargetControlID="TabPanel1" />

到目前为止,我在运行网站时遇到以下错误:
The TargetControlID of 'ClosableTabPanelExtender1' is not valid. A control with ID 'TabPanel1' could not be found.
该错误让我认为TabPanel无法扩展,所以我是否需要扩展TabContainer

除了错误之外,我可以使用一些方向,特别是使用Behavior脚本。这对我来说是最难以捉摸的部分,虽然我知道它可能包含我试图添加的大部分功能。我也不确定扩展器的其他部分如何与它一起工作。

我有Ajax Toolkit源代码,并查看了Tab控件的源代码,我部分理解。我还查看了几个控制扩展器的例子,主要是Matt Berseth's extenders和Dan Wahlin的一个。

1 个答案:

答案 0 :(得分:0)

我终于找到了我需要做的事情。对于对解决方案感兴趣的任何人:

  • 为了扩展TabPanel控件,我必须通过覆盖扩展程序的服务器代码(OnResolveControlID)中的ClosableTabPanelExtender.cs方法来解决我发布的错误。

    protected override void OnResolveControlID(ResolveControlEventArgs e)
    {
        // Get a reference to the outermost TabContainer that contains the TabPanel being extended.
        TabContainer tabContainer = (TabContainer)base.FindControl(OuterTabPanelID);
        if (tabContainer != null)
        {
            // Check to see if any of the tabs are the control we are looking form.
            foreach (TabPanel tab in tabContainer.Tabs)
            {
                if (tab.ID == e.ControlID)
                {
                    e.Control = tab;
                    return;
                }
            }
            // If none of the tabs are what we are looking for, search the contents of each tab.
            foreach (TabPanel tab in tabContainer.Tabs)
            {
                Control ctrl = tab.FindControl(e.ControlID);
                if (ctrl != null)
                    return;
            }
        }
    }
    
  • 对于扩展程序的客户端行为脚本(以及服务器和客户端代码之间的交互,this MSDN page上列出的文章很有用,可以为您节省很多麻烦。