从选项卡内回发后维护TabContainer活动选项卡(使用AutoPostBack ='false')

时间:2011-07-12 03:19:00

标签: asp.net postback tabcontainer

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

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

所以我的问题是:当某些子控件导致回发时,是否有办法维护所选标签?

一些限制:

  • 我无法启用AutoPostBack。这意味着this question问题的链接解决方案在这种情况下并不好。
  • UserControls并不总是在TabContainer / TabPanel中使用,所以解决方案不能假设是这种情况。
  • 解决方案需要相当健壮和直接,因为可能有不同的开发人员在处理此代码。

3 个答案:

答案 0 :(得分: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,然后将其作为活动面板。

答案 1 :(得分:1)

我从另一个论坛得到了这个。你在pageload中设置它。我不知道这是否有助于将它们设置为AutoPostBack = false,但如果你还没有放弃它,我希望这有帮助

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

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

}

答案 2 :(得分:-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"