1

我有一个带有多个 TabPanel 的 AjaxToolkit TabContainer 控件。每个 TabPanel 中都有一个不同的 UserControl 来显示一些信息。其中一些用户控件具有 LinkBut​​ton 或 GridView,其中包含命令按钮。TabContainer 有AutoPostBack="false",这就是我想保留它的方式。

当您单击 GridView 中的 LinkBut​​ton 或命令按钮时,会触发预期事件并运行代码。但是当页面返回时,会再次选择初始选项卡(而不是用户之前查看的选项卡)。

所以我的问题是:当某些子控件导致回发时,有没有办法维护选定的选项卡?

一些限制:

  • 我没有办法打开AutoPostBack。这意味着这个问题的链接解决方案在这种情况下不好。
  • 用户控件并不总是在 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 回答
-1

您需要为选项卡容器添加 ActiveTabChanged 事件,您可以将活动选项卡索引保持在视图状态,并在页面加载时检查它是否不为空,然后将其设置为活动选项卡索引。

protected void TabContainer1_ActiveTabChanged(object sender, EventArgs e)
    {
        ViewState["ActiveTabIndex"] = TabContainer1.ActiveTabIndex;

    }

PageOnLoad 事件代码

 if (!(ViewState["ActiveTabIndex"] == null) )
        {            
               TabContainer1.ActiveTabIndex = (int)ViewState["ActiveTabIndex"];          

        }

确保在 TabContainer 标记中添加以下属性

AutoPostBack="true" OnActiveTabChanged="TabContainer1_ActiveTabChanged"
于 2013-10-10T11:45:28.520 回答