如何从TabControl中隐藏TabPage

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

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

用于隐藏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属性尚未在Tabpages上实现,也没有Insert方法。

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

这是一个相同的工作。

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

我意识到这个问题是古老的,接受的答案是旧的,但…

至less在.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; 

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

创build一个新的空课,并在其中:

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

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

我将Jack Griffin和amazedsaint( 分别是dotnetspider 代码片段 )的答案合并为一个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"); 

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

您可以将该页面的父页面设置为空以隐藏,并仅显示将tabpage父页面设置为tabcontrol

那么,如果你不想弄乱现有的代码,只想隐藏一个选项卡,你可以修改编译器生成的代码来注释将选项卡添加到tabcontrol的行。

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

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

以下内容将阻止添加选项卡到tabcontrol

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

作为一个便宜的工作,我用一个标签来掩盖我想隐藏的标签。

然后,我们可以使用标签的可见支柱作为替代品。 如果有人走这条路线,不要忘记处理键盘笔画或能见度事件。 您不希望左侧的光标键暴露您试图隐藏的标签。

不知道“Winforms 2.0”,但这是经过validation和certificate:

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

应该注意的是,一个名为userUser对象已经被创build,它的AccessLevel属性被设置为AccessLevel其中一个用户定义的枚举值… whatever; 这只是我决定显示选项卡的一个条件。

我也有这个问题。 tabPage.Visible没有像前面说过的那样实现,这是一个很好的帮助(+1)。 我发现你可以重写控制,这将工作。 一些necroposting,但我想在这里张贴我的解决scheme给其他人…

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

我使用了相同的方法,但问题是,当标签页从标签控件TabPages列表中删除时,它也从标签页控件列表中删除。 处理表格时不处理。

所以,如果你有很多这样的“隐藏”标签页,你可以让窗口处理配额超过错误 ,只有应用程序重新启动才能修复它。

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

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

+1微软:-)。
我设法这样做:
(假定你有一个“下一步”button,显示下一个tabpage – tabSteps是Tab控件的名称)
在开始时,将所有的标签页保存在适当的列表中。 当用户按“下一步”button时,删除选项卡控件中的所有标签,然后添加适当的索引:

  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); } } 
 // 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中testing过,它的工作原理。

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