我有一个带有数字TabPanels的AjaxToolkit TabContainer控件。每个TabPanel都有一个不同的UserControl来显示一些信息。其中一些UserControl有一个LinkButton或一个带有命令按钮的GridView。 TabContainer有AutoPostBack="false"
,这就是我想保留它的方式。
当您单击GridView中的LinkButton或命令按钮时,会触发预期的事件并运行代码。但是当页面返回时,再次选择初始选项卡(而不是用户之前查看的选项卡)。
所以我的问题是:当某些子控件导致回发时,是否有办法维护所选标签?
一些限制:
AutoPostBack
。这意味着this question问题的链接解决方案在这种情况下并不好。答案 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"