0

AJAX コントロール ツールキットを変更できる AJAX コントロール エクステンダーを作成しようとしています。TabPanelこれにより、TabPanelヘッダーのテキストの後に画像が表示され、クリックすると、クライアント側スクリプトを使用して (ポストバックなしで) タブ ヘッダーが非表示になります。また、タブが閉じられたときにも呼び出される onClientClose 関数を指定できるようにしたいと考えています。

私は ASP コントロール エクステンダーを初めて使用しますが、これまで [チュートリアル]( http://www.asp.net/ajax/tutorials/creating-a-custom-ajax-control-toolkit-control-extenderに従っています。 -csカスタム エクステンダーを作成するための ASP.NET サイトの「カスタム AJAX コントロール ツールキット コントロール エクステンダーの作成」)。エクステンダーを aClosableTabPanelExtenderと呼び、エクステンダー プロジェクトがビルドされます。次のようなテスト Web ページをセットアップしました。

<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" />

これまでのところ、Web サイトを実行すると次のエラーが表示されます。
The TargetControlID of 'ClosableTabPanelExtender1' is not valid. A control with ID 'TabPanel1' could not be found.
このエラーにより、aTabPanelを拡張できないと思われTabContainerます。

エラーとは別に、特に Behavior スクリプトを使用する場合は、いくつかの方向性を使用できます。これは、私が追加しようとしている機能のほとんどを収容する可能性が高いことはわかっていますが、私にとって最もとらえどころのない部分です。また、エクステンダーの他の部分がどのように連携して機能するかもわかりません。

私は Ajax Toolkit のソース コードを持っており、タブ コントロールのソースを調べましたが、部分的に理解できました。また、主に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;
            }
        }
    }
    
  • エクステンダーのクライアント側の動作スクリプト (およびサーバーとクライアント コード間の対話) については、この MSDN ページにリストされている記事が役に立ち、多くの問題を解決してくれます。

于 2010-07-28T22:12:25.320 に答える