1

いくつかのTabPanelを備えたAjaxToolkitTabContainerコントロールがあります。各TabPanelには、いくつかの情報を表示するための異なるUserControlがあります。これらのUserControlの一部には、コマンドボタンを含むLinkBut​​tonまたはGridViewがあります。TabContainerにはAutoPostBack="false"ありますが、これを維持したいと思います。

GridViewのLinkBut​​tonまたはコマンドボタンをクリックすると、予期されるイベントが発生し、コードが実行されます。ただし、ページが返されると、最初のタブが再度選択されます(ユーザーが以前に表示していたタブではありません)。

だから私の質問は:いくつかの子コントロールがポストバックを引き起こしたときに選択されたタブを維持する方法はありますか?

いくつかの制約:

  • 電源を入れる方法はありませんAutoPostBack。これは、この質問の質問に対するリンクされた解決策がこの場合は良くないことを意味します。
  • UserControlsはTabContainer/TabPanelで常に使用されるとは限らないため、ソリューションはこれが当てはまると想定することはできません。
  • このコードにはさまざまな開発者が取り組んでいる可能性があるため、ソリューションはかなり堅牢でわかりやすいものである必要があります。
4

3 に答える 3

2

TabContainer から継承する独自のコントロールを作成し、次のように LoadClientState() をオーバーライドすることで、この問題を解決しました。

    protected override void LoadClientState(string clientState)
    {
        base.LoadClientState(clientState);

        // If post back was caused by control on a tab, make that tab the active one
        if (!string.IsNullOrEmpty(this.Page.Request.Params["__EVENTTARGET"]))
        {
            foreach (string ctlName in this.Page.Request.Params["__EVENTTARGET"].Split('$'))
            {
                if (this.FindControl(ctlName) is TabPanel && this.Tabs.Contains(this.FindControl(ctlName) as TabPanel))
                {
                    this.ActiveTab = (this.FindControl(ctlName) as TabPanel);
                    break;
                }
            }
        }
    }

これは、ポストバックの原因となっているコントロールが存在する TabPanel を見つけ、それをアクティブなパネルにします。

于 2012-06-29T16:13:02.513 に答える
1

これは別のフォーラムから入手しました。これはページロードで設定します。AutoPostBack = falseに設定するのに役立つかどうかはわかりませんが、まだ諦めていなければ、これが役立つことを願っています。

if (ViewState("ActiveTabIdx") != null) 
            { 
                activeTabIndex = Convert.ToInt32(ViewState("ActiveTabIdx"))

                 if (activeTabIndex != null) 
                { 
                    TabContainer1.ActiveTabIndex = activeTabIndex; 
                }

}
于 2011-09-30T13:11:16.413 に答える