我如何禁用TabControl内的选项卡?

有没有一种方法来禁用TabControl中的选项卡?

我正在使用C#。

TabPage类隐藏启用属性。 这是故意的,因为它有一个尴尬的UIdevise问题。 基本的问题是,禁用页面也不会禁用该选项卡。 如果尝试通过禁用select事件选项卡来解决该问题,那么当TabControl只有一个页面时它不起作用。

如果这些可用性问题不关心,那么请记住,该属性仍然有效,它只是隐藏在智能感知中。 如果FUD不舒服,那么你可以简单地这样做:

public static void EnableTab(TabPage page, bool enable) { foreach (Control ctl in page.Controls) ctl.Enabled = enable; } 

将TabPage转换为控件,然后将Enabled属性设置为false。

 ((Control)this.tabPage).Enabled = false; 

因此,标签页的标题仍将被启用,但其内容将被禁用。

你可以简单地使用:

 tabPage.Enabled = false; 

此属性不显示,但它没有任何问题。

您可以在TabControler对select事件进行编程,使其无法更改为不可编辑的选项卡:

 private void tabControler_Selecting(object sender, TabControlCancelEventArgs e) { e.Cancel = !e.TabPage.Enabled; } 

您可以注册“select”事件并取消导航到标签页:

 private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { if (e.TabPage == tabPage2) e.Cancel = true; } 

另一个想法是将所有的控件放在Panel控件的tabpage上并禁用面板! 斯迈利

您也可以从tabControl1.TabPages集合中删除tabpage。 这将隐藏tabpage。

学分转到littleguru @频道9 。

据推测,你想看到在选项卡控制选项卡,但你希望它是“禁用”(即灰色,不可选)。 没有对此的内置支持,但是您可以覆盖绘图机制以提供所需的效果。

这里提供了一个如何做到这一点的例子。

神奇的是在这个源代码片段中,在DisableTab_DrawItem方法中:

 this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem ); 

扩展CédricGuillemette答案后,禁用Control

 ((Control)this.tabPage).Enabled = false; 

…然后你可以处理TabControlSelecting事件:

 private void tabControl_Selecting(object sender, TabControlCancelEventArgs e) { e.Cancel = !((Control)e.TabPage).Enabled; } 

这将删除标签页,但是您需要在需要时重新添加它:

 tabControl1.Controls.Remove(tabPage2); 

如果您稍后需要,可能需要在删除之前将其存储在临时标签页中,然后在需要时重新添加。

唯一的方法是捕捉Selecting事件,并防止激活标签。

我不得不处理这一点。 我从TabPages集合中删除了Tab(我认为就是这样),并在条件改变时重新添加。 但那只是在Winforms中,我可以保持这个标签,直到我再次需要它。

你可以通过tabpage:tabPage1.Hide(),tabPage2.Show()等

tabControl.TabPages.Remove(tabPage1);

最棘手的方法是使其父母等于空(使标签独自没有父母):

  tabPage.Parent = null; 

并且当你想返回时(将在页面收集结束时返回):

 tabPage.Parent = tabControl; 

如果您想将其返回到您可以使用的页面中的特定位置:

 tabControl.TabPages.Insert(indexLocationYouWant, tabPage); 

我已经删除过去的标签页,以防止用户点击它们。 这可能不是最好的解决scheme,因为他们可能需要看到标签页存在。

使用事件以及选项卡控件的属性,可以在需要时启用/禁用所需内容。 我使用了一个bool,可用于所有使用tabControl的mdi子表单类中的所有方法。

记住select事件每次点击任何标签时触发。 对于大量的标签,“CASE”可能比一堆ifs更容易使用。

 public partial class Form2 : Form { bool formComplete = false; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { formComplete = true; tabControl1.SelectTab(1); } private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { if (tabControl1.SelectedTab == tabControl1.TabPages[1]) { tabControl1.Enabled = false; if (formComplete) { MessageBox.Show("You will be taken to next tab"); tabControl1.SelectTab(1); } else { MessageBox.Show("Try completing form first"); tabControl1.SelectTab(0); } tabControl1.Enabled = true; } } } 

我已经解决了这样的问题:我有3个选项卡,我想保持在第一个标签的用户,如果他没有login,所以在TabControl的SelectingEvent我写

 if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); } 

用户不能点击标签进行导航,但可以使用两个button(“ 下一步”和“ 后退” )。 如果不符合//条件,用户将无法继续下一步。

 private int currentTab = 0; private void frmOneTimeEntry_Load(object sender, EventArgs e) { tabMenu.Selecting += new TabControlCancelEventHandler(tabMenu_Selecting); } private void tabMenu_Selecting(object sender, TabControlCancelEventArgs e) { tabMenu.SelectTab(currentTab); } private void btnNextStep_Click(object sender, EventArgs e) { switch(tabMenu.SelectedIndex) { case 0: //if conditions met GoTo case 2: //if conditions met GoTo case n: //if conditions met GoTo { CanLeaveTab: currentTab++; tabMenu.SelectTab(tabMenu.SelectedIndex + 1); if (tabMenu.SelectedIndex == 3) btnNextStep.Enabled = false; if (btnBackStep.Enabled == false) btnBackStep.Enabled = true; CannotLeaveTab: ; } private void btnBackStep_Click(object sender, EventArgs e) { currentTab--; tabMenu.SelectTab(tabMenu.SelectedIndex - 1); if (tabMenu.SelectedIndex == 0) btnBackStep.Enabled = false; if (btnNextStep.Enabled == false) btnNextStep.Enabled = true; } 

vb.Net的rfnodulator答案:

 Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting e.Cancel = Not e.TabPage.Enabled End Sub 

假设你有这些控制:

带有名称tcExemple的TabControl。

带有名称tpEx1和tpEx2的TabPages。

尝试一下:

将您的TabPage的DrawMode设置为OwnerDrawFixed; 在InitializeComponent()之后,确保通过添加下面的代码来启用tpEx2:

 ((Control)tcExemple.TabPages["tpEx2").Enabled = false; 

添加到selecttcExemple事件的代码如下:

 private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e) { if (!((Control)e.TabPage).Enabled) { e.Cancel = true; } } 

附加到tcExemple这个代码的DrawItem事件:

 private void tcExemple_DrawItem(object sender, DrawItemEventArgs e) { TabPage page = tcExemple.TabPages[e.Index]; if (!((Control)page).Enabled) { using (SolidBrush brush = new SolidBrush(SystemColors.GrayText)) { e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds); } } else { using (SolidBrush brush = new SolidBrush(page.ForeColor)) { e.Graphics.DrawString(page.Text, page.Font, brush, e.Bounds); } } } 

这将使第二个标签不可点击。

在表单加载事件中,如果我们写this.tabpage.PageEnabled = false ,tabpage将被禁用。

使用:

  tabControl1.TabPages[1].Enabled = false; 

通过编写这个代码,标签页将不会被完全禁用(不能select),但其内部的内容将被禁用,我认为满足您的需求。

 MyTabControl.SelectedTab.Enabled = false;