Сохранение активной вкладки TabContainer после обратной передачи из вкладок (с AutoPostBack = 'false') - PullRequest
1 голос
/ 12 июля 2011

У меня есть элемент управления AjaxToolkit TabContainer с несколькими TabPanels. Каждая панель TabPanel имеет свой собственный UserControl для отображения некоторой информации. Некоторые из этих пользовательских элементов управления имеют либо LinkButton, либо GridView с командной кнопкой. TabContainer имеет AutoPostBack="false", и я бы хотел сохранить его.

Когда вы нажимаете LinkButton или командную кнопку в GridView, ожидаемые события запускаются, и код запускается. Но когда страница возвращается, исходная вкладка выбирается снова (а не вкладка, которую пользователь ранее просматривал).

Итак, мой вопрос: Есть ли способ сохранить выбранную вкладку, когда какой-то дочерний элемент управления вызывает обратную передачу?

Некоторые ограничения:

  • Я не могу включить AutoPostBack. Это означает, что связанное решение для этот вопрос вопрос не годится в этом случае.
  • UserControls не всегда используются в TabContainer / TabPanel, поэтому решение не может предположить, что это так.
  • Решение должно быть достаточно надежным и простым, так как над этим кодом могут работать разные разработчики.

Ответы [ 3 ]

2 голосов
/ 29 июня 2012

Я решил эту проблему, создав свой собственный элемент управления, наследуемый от 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 голос
/ 30 сентября 2011

Я получил это с другого форума. Вы устанавливаете это в загрузке страницы. Я не знаю, поможет ли это установить AutoPostBack = false, но если вы еще не отказались от этого, надеюсь, это поможет

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

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

}
0 голосов
/ 10 октября 2013

вам нужно добавить событие 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"
...