如何在 TabControl 中隐藏 TabPage

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

349234 次浏览

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

尚未在“制表页”上实现“可见性”属性,也没有“插入”方法。

您需要手动插入和删除选项卡页。

这里有一个相同的工作。

Http://www.dotnetspider.com/resources/18344-hiding-showing-tabpages-tabcontrol.aspx

隐藏 TabPage 的代码段

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

显示制表页的代码段

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

变种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;

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

然后我们可以使用标签的可见道具作为替代品。如果有人走这条路线,不要忘记处理键盘敲击或可见性事件。您不会希望左右光标键暴露您试图隐藏的选项卡。

    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 中。保留对函数实例的引用,并保留原始的制表符顺序。

微软 + 1: ——)。
我设法这样做:
(它假设您有一个 Next按钮,该按钮显示下一个 TabPage-tabSteps是 Tab 控件的名称)
在启动时,将所有选项卡保存在一个适当的列表中。
当用户按 Next按钮时,删除 tab 控件中的所有 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);
}
}

可以将选项卡的父级设置为 null 以进行隐藏 并显示刚刚设置的制表页父控件的制表页控件

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

好吧,如果你不想搞乱现有的代码,只是想隐藏一个选项卡,你可以修改编译器生成的代码来注释行,将选项卡添加到选项卡控件。

例如: 以下行将一个名为“ readformat Card page”的选项卡添加到名为“ Tabcontrol”的 Tabcontrol 中

控件。添加(this.readformat 卡页) ;

下面的代码将防止将选项卡添加到选项卡控件中

//this. tabcontrol. Controls. Add (this.readformat carpage) ;

不确定“ Winforms2.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;
}

需要注意的是,一个名为 userUser对象已经被创建,它的 AccessLevel属性被设置为 AccessLevelEnum的一个用户定义的枚举值... ... 不管怎样,这只是我决定是否显示选项卡的一个条件。

我也有个问题。标签页。可见并没有像前面所说的那样实现,这是一个很大的帮助(+ 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;
}
}

创建一个新的空类并在其中通过:

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

在表单代码中添加对 ExtensionMethod 命名空间的引用:

using ExtensionMethods;

现在你可以使用 yourTabPage.IsVisible();来检查它的可见性,使用 yourTabPage.HidePage();来隐藏它,使用 yourTabPage.ShowPageInTabControl(parentTabControl);来显示它。

我使用了相同的方法,但问题是当选项卡页从选项卡控件 TabPages 列表中删除时,它也从选项卡页控件列表中删除。当形式被处置时,它不会被处置。

因此,如果你有很多这样的“隐藏”标签页,你可以 获取 Windows 句柄配额超出错误和只有应用程序重新启动将修复它。

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

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

[1]可见 = true/false;

我将来自@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();
}
}

我知道这个问题很老套,大家都接受的答案也很老套,但是..。

至少在.NET 4.0中..。

隐藏标签:

tabControl.TabPages.Remove(tabPage);

把它放回去:

tabControl.TabPages.Insert(index, tabPage);

TabPages在这方面比 Controls好得多。

隐藏标签页并删除标题:

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

显示标签页并可见标题:

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