如何从TabControl隐藏TabPage

时间:2009-02-16 08:15:36

标签: c# winforms tabcontrol tabpage

如何在WinForms 2.0中隐藏TabControl中的TabPage?

22 个答案:

答案 0 :(得分:130)

不,这不存在。您必须删除选项卡并在需要时重新添加。或使用其他(第三方)标签控件。

答案 1 :(得分:91)

隐藏标签页的代码段

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

显示标签页的代码段

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

答案 2 :(得分:38)

我意识到问题已经过时了,接受的答案已经过时了,但是......

至少在.NET 4.0中......

隐藏标签:

tabControl.TabPages.Remove(tabPage);

把它放回去:

tabControl.TabPages.Insert(index, tabPage);

TabPages的效果比Controls好得多。

答案 3 :(得分:29)

在Tabpages上尚未实现Visiblity属性,也没有Insert方法。

您需要手动插入和删除标签页。

这是一个解决方法。

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

答案 4 :(得分:19)

变式1

为了避免视觉klikering,您可能需要使用:

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;

答案 5 :(得分:13)

到目前为止提供的解决方案太复杂了。 阅读最简单的解决方案: 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;
}

答案 6 :(得分:5)

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);
}

答案 7 :(得分:5)

我将@Jack Griffin和@amazedsaint(the dotnetspider code snippet respectively)的答案合并为一个 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();
    }
}

答案 8 :(得分:4)

创建一个新的空类并将其放在其中:

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);显示它。

答案 9 :(得分:1)

好吧,如果您不想搞乱现有代码并且只想隐藏选项卡,您可以修改编译器生成的代码来注释将选项卡添加到tabcontrol的行。

例如: 以下行将名为“readformatcardpage”的选项卡添加到名为“tabcontrol”

的Tabcontrol中

this.tabcontrol.Controls.Add(this.readformatcardpage);

以下内容将阻止将标签添加到tabcontrol

// this.tabcontrol.Controls.Add(this.readformatcardpage);

答案 10 :(得分:1)

您可以将tabpage的父级设置为null以进行隐藏 并显示将tabpage parent设置为tabcontrol

答案 11 :(得分:1)

+1 for microsoft :-)。
我设法这样做:
(它假设您有一个显示下一个TabPage的Next按钮 - tabSteps是Tab控件的名称)
启动时,将所有标签保存在正确的列表中 当用户按下Next按钮时,删除选项卡控件中的所有TabPages,然后使用正确的索引添加该选项卡:

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);
    }
}  

答案 12 :(得分:1)

    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");

选项卡的原始顺序保存在完全隐藏在匿名函数内的List中。保留对函数实例的引用,并保留原始Tab键顺序。

答案 13 :(得分:0)

不确定“Winforms 2.0”,但经过尝试并证明:

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

答案 14 :(得分:0)

在WPF中,它非常简单:

假设您已为TabItem指定了名称,例如

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

您可以在表单后面的代码中使用以下代码:

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

应该注意的是,创建了一个名为User的{​​{1}}对象,其user属性设置为用户定义的枚举值AccessLevel之一。 。 随你;这只是我决定是否显示标签的条件。

答案 15 :(得分:0)

我也有这个问题。 tabPage.Visible未按前面所述实现,这是一个很好的帮助(+1)。我发现你可以覆盖控件,这将起作用。有点necroposting,但我想在这里为别人发布我的解决方案......

    [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;
    }
}

答案 16 :(得分:0)

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;
    }
}

答案 17 :(得分:0)

我使用了相同的方法,但问题是当标签页从标签控件TabPages列表中删除时,它也会从标签页控件列表中删除。并且在处理形式时不进行处理。

所以如果你有很多这样的&#34;隐藏&#34;标签页,你可以get windows handle quota exceeded error,只有应用程序重启才能修复它。

答案 18 :(得分:0)

如果您正在讨论AjaxTabControlExtender,请设置每个选项卡的TabIndex,并根据需要设置Visible属性True / False。

myTab.Tabs [1]。可见=真/假;

答案 19 :(得分:0)

作为一种廉价的工作,我使用了一个标签来掩盖我想要隐藏的标签。

然后我们可以使用标签的可见支柱作为替代品。如果有人这样做,请不要忘记处理键盘敲击或可见性事件。您不希望左右光标键暴露您要隐藏的标签。

答案 20 :(得分:-1)

// 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中测试过,它可以正常工作。

答案 21 :(得分:-3)

隐藏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;