Как скрыть TabPage от TabControl [дубликат]

этот вопрос уже есть ответ здесь:

Как скрыть TabPage из TabControl в WinForms 2.0?

22 ответов


нет, этого не существует. Вы должны удалить вкладку и повторно добавить ее, когда захотите. Или используйте другой (сторонний) элемент управления tab.


фрагмент кода для скрытия TabPage

private void HideTab1_Click(object sender, EventArgs e)
{
    tabControl1.TabPages.Remove(tabPage1);
}

фрагмент кода для отображения TabPage

private void ShowTab1_Click(object sender, EventArgs e)
{
    tabControl1.TabPages.Add(tabPage1);
}

Visiblity свойство не было реализовано на страницах табуляции, и нет метода Insert также.

нужно вручную вставить и удалить закладки.

вот примерно то же самое.

http://www.dotnetspider.com/resources/18344-Hiding-Showing-Tabpages-Tabcontrol.aspx


Я понимаю, что вопрос старый, и принятый ответ старый, но ...

по крайней мере, в .NET 4.0 ...

скрыть вкладку:

tabControl.TabPages.Remove(tabPage);

чтобы положить его обратно:

tabControl.TabPages.Insert(index, tabPage);

TabPages работает намного лучше, чем Controls для этого.


Вариант 1

чтобы избежать визуального кликеринга, вам может потребоваться использовать:

bindingSource.RaiseListChangeEvent = false 

или

myTabControl.RaiseSelectedIndexChanged = false

удалить закладку:

myTabControl.Remove(myTabPage);

добавить закладку:

myTabControl.Add(myTabPage);

вставьте вкладку в определенном месте:

myTabControl.Insert(2, myTabPage);

не забудьте отменить изменения:

bindingSource.RaiseListChangeEvent = true;

или

myTabControl.RaiseSelectedIndexChanged = true;

Вариант 2

myTabPage.parent = null;
myTabPage.parent = myTabControl;

решения пока слишком сложно. Прочитайте самое простое решение на: http://www.codeproject.com/Questions/614157/How-to-Hide-TabControl-Headers

вы можете использовать этот метод, чтобы сделать их незаметными во время выполнения:

private void HideAllTabsOnTabControl(TabControl theTabControl)
{
  theTabControl.Appearance = TabAppearance.FlatButtons;
  theTabControl.ItemSize = new Size(0, 1);
  theTabControl.SizeMode = TabSizeMode.Fixed;
}

private System.Windows.Forms.TabControl _tabControl;
private System.Windows.Forms.TabPage _tabPage1;
private System.Windows.Forms.TabPage _tabPage2;

...
// Initialise the controls
...

// "hides" tab page 2
_tabControl.TabPages.Remove(_tabPage2);

// "shows" tab page 2
// if the tab control does not contain tabpage2
if (! _tabControl.TabPages.Contains(_tabPage2))
{
    _tabControl.TabPages.Add(_tabPage2);
}

создать новый пустой класс и мимо этого внутри него:

using System.Windows.Forms;

namespace ExtensionMethods
{
    public static class TabPageExtensions
    {

        public static bool IsVisible(this TabPage tabPage)
        {
            if (tabPage.Parent == null)
                return false;
            else if (tabPage.Parent.Contains(tabPage))
                return true;
            else
                return false;
        }

        public static void HidePage(this TabPage tabPage)
        {
            TabControl parent = (TabControl)tabPage.Parent;
            parent.TabPages.Remove(tabPage);
        }

        public static void ShowPageInTabControl(this TabPage tabPage,TabControl parent)
        {
            parent.TabPages.Add(tabPage);
        }
    }
}

2-Добавить ссылку на пространство имен ExtensionMethods в коде формы:

using ExtensionMethods;

3 - Теперь вы можете использовать yourTabPage.IsVisible(); чтобы проверить его видимость, yourTabPage.HidePage(); чтобы скрыть его, и yourTabPage.ShowPageInTabControl(parentTabControl); показывать.


Я объединил ответ от @Jack Griffin и один из @amazedsaint (фрагмент кода dotnetspider соответственно) в единый TabControlHelper.

на TabControlHelper позволяет:

  • Показать / Скрыть все закладки
  • Показать / Скрыть одну вкладку
  • сохранить исходное положение вкладок
  • страницы вкладок подкачки

public class TabControlHelper
{
    private TabControl _tabControl;
    private List<KeyValuePair<TabPage, int>> _pagesIndexed;
    public TabControlHelper(TabControl tabControl)
    {
        _tabControl = tabControl;
        _pagesIndexed = new List<KeyValuePair<TabPage, int>>();

        for (int i = 0; i < tabControl.TabPages.Count; i++)
        {
            _pagesIndexed.Add(new KeyValuePair<TabPage, int> (tabControl.TabPages[i], i ));
        }
    }

    public void HideAllPages()
    {
        for (int i = 0; i < _pagesIndexed.Count; i++)
        {
            _tabControl.TabPages.Remove(_pagesIndexed[i].Key);
        }
    }

    public void ShowAllPages()
    {
        for (int i = 0; i < _pagesIndexed.Count; i++)
        {
            _tabControl.TabPages.Add(_pagesIndexed[i].Key);
        }
    }

    public void HidePage(TabPage tabpage)
    {
        if (!_tabControl.TabPages.Contains(tabpage)) return;
        _tabControl.TabPages.Remove(tabpage);
    }

    public void ShowPage(TabPage tabpage)
    {
        if (_tabControl.TabPages.Contains(tabpage)) return;
        InsertTabPage(GetTabPage(tabpage).Key, GetTabPage(tabpage).Value);
    }

    private void InsertTabPage(TabPage tabpage, int index)
    {
        if (index < 0 || index > _tabControl.TabCount)
            throw new ArgumentException("Index out of Range.");
        _tabControl.TabPages.Add(tabpage);
        if (index < _tabControl.TabCount - 1)
            do
            {
                SwapTabPages(tabpage, (_tabControl.TabPages[_tabControl.TabPages.IndexOf(tabpage) - 1]));
            }
            while (_tabControl.TabPages.IndexOf(tabpage) != index);
        _tabControl.SelectedTab = tabpage;
    }

    private void SwapTabPages(TabPage tabpage1, TabPage tabpage2)
    {
        if (_tabControl.TabPages.Contains(tabpage1) == false || _tabControl.TabPages.Contains(tabpage2) == false)
            throw new ArgumentException("TabPages must be in the TabControls TabPageCollection.");

        int Index1 = _tabControl.TabPages.IndexOf(tabpage1);
        int Index2 = _tabControl.TabPages.IndexOf(tabpage2);
        _tabControl.TabPages[Index1] = tabpage2;
        _tabControl.TabPages[Index2] = tabpage1;
    }

    private KeyValuePair<TabPage, int> GetTabPage(TabPage tabpage)
    {
        return _pagesIndexed.Where(p => p.Key == tabpage).First();
    }
}

    public static Action<Func<TabPage, bool>> GetTabHider(this TabControl container) {
        if (container == null) throw new ArgumentNullException("container");

        var orderedCache = new List<TabPage>();
        var orderedEnumerator = container.TabPages.GetEnumerator();
        while (orderedEnumerator.MoveNext()) {
            var current = orderedEnumerator.Current as TabPage;
            if (current != null) {
                orderedCache.Add(current);
            }
        }

        return (Func<TabPage, bool> where) => {
            if (where == null) throw new ArgumentNullException("where");

            container.TabPages.Clear();
            foreach (TabPage page in orderedCache) {
                if (where(page)) {
                    container.TabPages.Add(page);
                }
            }
        };
    }

используйте его так:

    var hider = this.TabContainer1.GetTabHider();
    hider((tab) => tab.Text != "tabPage1");
    hider((tab) => tab.Text != "tabpage2");

исходный порядок вкладок хранится в списке, который полностью скрыт внутри анонимной функции. Сохраните ссылку на экземпляр функции и сохраните исходный порядок вкладок.


вы можете установить для родительской страницы tabpage значение null для скрытия и чтобы показать, просто установите tabpage parent в tabcontrol


Ну, если вы не хотите испортить существующий код и просто хотите скрыть вкладку, вы можете изменить сгенерированный компилятором код, чтобы прокомментировать строку, которая добавляет вкладку в tabcontrol.

например: Следующая строка добавляет вкладку с именем "readformatcardpage" в Tabcontrol с именем "tabcontrol"

этого.элемент управления TabControl.Контроли.Добавить это.readformatcardpage);

следующее предотвратит добавление вкладки в элемент управления TabControl

//в этом.элемент управления TabControl.Контроли.Добавить это.readformatcardpage);


+1 для microsoft : -).
Мне удалось сделать это так:
(предполагается, что у вас есть кнопка "Далее", которая отображает следующую вкладку - tabSteps-это имя элемента управления Tab)
При запуске сохраните все вкладки в соответствующем списке . Когда пользователь нажимает кнопку Далее, удалите все вкладки в элементе управления tab, а затем добавьте это с соответствующим индексом:

        int step = -1;
        List<TabPage> savedTabPages;

        private void FMain_Load(object sender, EventArgs e) {
            // save all tabpages in the list
            savedTabPages = new List<TabPage>();
            foreach (TabPage tp in tabSteps.TabPages) {
                savedTabPages.Add(tp);
            }
            SelectNextStep();
        }

        private void SelectNextStep() {
            step++;
            // remove all tabs
            for (int i = tabSteps.TabPages.Count - 1; i >= 0 ; i--) {
                    tabSteps.TabPages.Remove(tabSteps.TabPages[i]);
            }

            // add required tab
            tabSteps.TabPages.Add(savedTabPages[step]);
        }

        private void btnNext_Click(object sender, EventArgs e) {
            SelectNextStep();
        }

обновление

public class TabControlHelper {
    private TabControl tc;
    private List<TabPage> pages;
    public TabControlHelper(TabControl tabControl) {
        tc = tabControl;
        pages = new List<TabPage>();
        foreach (TabPage p in tc.TabPages) {
            pages.Add(p);
        }
    }

    public void HideAllPages() {
        foreach(TabPage p in pages) {
            tc.TabPages.Remove(p);
        }
    }

    public void ShowAllPages() {
        foreach (TabPage p in pages) {
            tc.TabPages.Add(p);
        }
    }

    public void HidePage(TabPage tp) {
        tc.TabPages.Remove(tp);
    }        

    public void ShowPage(TabPage tp) {
        tc.TabPages.Add(tp);
    }
}  

как дешевая работа, я использовал ярлык, чтобы скрыть вкладки, которые я хотел скрыть.

затем мы можем использовать видимую опору метки в качестве замены. Если кто-то идет по этому маршруту, не забудьте обработать штрихи клавиатуры или события видимости. Вы не хотите, чтобы левые правые клавиши курсора отображали вкладку, которую вы пытаетесь скрыть.


Не уверен в "Winforms 2.0", но это проверено и доказано:

http://www.mostthingsweb.com/2011/01/hiding-tab-headers-on-a-tabcontrol-in-c/


в WPF это довольно просто:

предполагая, что вы дали TabItem имя, например,

<TabItem Header="Admin" Name="adminTab" Visibility="Hidden">
<!-- tab content -->
</TabItem>

вы можете иметь следующее в коде за формой:

 if (user.AccessLevel == AccessLevelEnum.Admin)
 {
     adminTab.Visibility = System.Windows.Visibility.Visible;
 }

следует отметить, что a User объект user был создан с AccessLevel свойство установлено в одно из определяемых пользователем значений перечисления AccessLevelEnum... неважно; это просто условие, по которому я решаю показать вкладку или нет.


У меня также был этот вопрос. tabPage.Visible не реализован, как говорилось ранее, что было большой помощью (+1). Я обнаружил, что вы можете переопределить управление, и это сработает. Немного некропостинг, но я думала, размещать мое решение здесь для других...

    [System.ComponentModel.DesignerCategory("Code")]
public class MyTabPage : TabPage
{
    private TabControl _parent;
    private bool _isVisible;
    private int _index;
    public new bool Visible
    {
        get { return _isVisible; }
        set
        {
            if (_parent == null) _parent = this.Parent as TabControl;
            if (_parent == null) return;

            if (_index < 0) _index = _parent.TabPages.IndexOf(this);
            if (value && !_parent.TabPages.Contains(this))
            {
                if (_index > 0) _parent.TabPages.Insert(_index, this);
                else _parent.TabPages.Add(this);
            }
            else if (!value && _parent.TabPages.Contains(this)) _parent.TabPages.Remove(this);

            _isVisible = value;
            base.Visible = value;
        }
    }

    protected override void InitLayout()
    {
        base.InitLayout();
        _parent = Parent as TabControl;
    }
}

    TabPage pageListe, pageDetay;
    bool isDetay = false;
    private void btnListeDetay_Click(object sender, EventArgs e)
    {
        if (isDetay)
        {
            isDetay = false;
            tc.TabPages.Remove(tpKayit);
            tc.TabPages.Insert(0,pageListe);
        }
        else
        {
            tc.TabPages.Remove(tpListe);
            tc.TabPages.Insert(0,pageDetay);
            isDetay = true;
        }
    }

Я использовал тот же подход, но проблема в том, что, когда страница вкладки была удалена из списка вкладок управления вкладками, она также удаляется из списка элементов управления страницей вкладок. И она не утилизируется, когда утилизируется форма.

поэтому, если у вас много таких "скрытых" вкладок, вы можете получить квоту дескриптора windows превышена ошибка и только перезапуск приложения исправит это.


Если вы говорите о AjaxTabControlExtender, то установите TabIndex каждой вкладки и установите видимое свойство True/False в соответствии с вашими потребностями.

myTab.Вкладок[1].Visible=true / false;


// inVisible
TabPage page2 = tabControl1.TabPages[0];
page2.Visible= false;
//Visible 
page2.Visible= true;
// disable
TabPage page2 = tabControl1.TabPages[0];
page2.Enabled = false;
// enable
page2.Enabled = true;
//Hide
tabCtrlTagInfo.TabPages(0).Hide()
tabCtrlTagInfo.TabPages(0).Show()

просто скопируйте пасту и попробуйте,приведенный выше код был протестирован в vs2010, он работает.


скрыть TabPage и удалить заголовок:

this.tabPage1.Hide();
this.tabPage3.Hide();
this.tabPage5.Hide();
tabControl1.TabPages.Remove(tabPage1);
tabControl1.TabPages.Remove(tabPage3);
tabControl1.TabPages.Remove(tabPage5);

показать TabPage и видимый заголовок:

tabControl1.TabPages.Insert(0,tabPage1);
tabControl1.TabPages.Insert(2, tabPage3);
tabControl1.TabPages.Insert(4, tabPage5);
this.tabPage1.Show();
this.tabPage3.Show();
this.tabPage5.Show();
tabControl1.SelectedTab = tabPage1;