【问题标题】:Maintaining TabContainer active tab after postback from within the tabs (with AutoPostBack='false')从选项卡内回发后保持 TabContainer 活动选项卡(使用 AutoPostBack='false')
【发布时间】:2013-10-10 19:45:28
【问题描述】:

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

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

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

一些限制:

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

【问题讨论】:

  • 我现在也有同样的问题。我的页面上有导致刷新的模式,但我需要用户所在的选项卡在刷新时保持活动状态。如果您能够找到解决方案,请在此处发布以提供帮助!谢谢!
  • 很遗憾没有找到解决办法。

标签: asp.net postback tabcontainer


【解决方案1】:

我通过创建自己的继承自 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,然后使其成为活动面板。

【讨论】:

    【解决方案2】:

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

    if (ViewState("ActiveTabIdx") != null) 
                { 
                    activeTabIndex = Convert.ToInt32(ViewState("ActiveTabIdx"))
    
                     if (activeTabIndex != null) 
                    { 
                        TabContainer1.ActiveTabIndex = activeTabIndex; 
                    }
    
    }
    

    【讨论】:

    • 好吧,我换了工作,所以你可以说我放弃了 :) 如果你对此进行测试并发现它适用于 AutoPostBack=false,我会接受这个答案。否则我可能会稍后检查它,但不再设置 Visual Studio 开发环境。此外,如果您包含指向您从中找到的帖子的链接,那就太好了。
    【解决方案3】:

    您需要为选项卡容器添加 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2014-05-22
      • 2018-10-24
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多