0

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

我是 ASP 控件扩展器的新手,到目前为止,我一直遵循 [tutorial]( http://www.asp.net/ajax/tutorials/creating-a-custom-ajax-control-toolkit-control-extender -cs "Creating a Custom AJAX Control Toolkit Control Extender") 在 ASP.NET 站点上用于创建自定义扩展器。我已经调用了我的扩展器 a 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.
该错误让我认为 aTabPanel无法扩展,所以我必须扩展aTabContainer吗?

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

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

4

1 回答 1

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;
            }
        }
    }
    
  • 至于扩展器的客户端 Behavior 脚本(以及服务器和客户端代码的交互,这个 MSDN 页面上列出的文章很有帮助,会为你省去很多麻烦。

于 2010-07-28T22:12:25.320 回答