如何在WinForms 2.0中隐藏TabControl中的TabPage?
答案 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)
为了避免视觉klikering,您可能需要使用:
bindingSource.RaiseListChangeEvent = false
或
myTabControl.RaiseSelectedIndexChanged = false
删除标签页:
myTabControl.Remove(myTabPage);
添加标签页:
myTabControl.Add(myTabPage);
在特定位置插入标签页:
myTabControl.Insert(2, myTabPage);
不要忘记撤消更改:
bindingSource.RaiseListChangeEvent = true;
或
myTabControl.RaiseSelectedIndexChanged = true;
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;