如何从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; }
应该注意的是,一个名为user
的User
对象已经被创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;