如何禁用TabControl中的选项卡?

Gol*_*old 73 c# tabcontrol winforms

有没有办法禁用TabControl中的选项卡?

我正在使用C#.

Céd*_*tte 85

将TabPage转换为Control,然后将Enabled属性设置为false.

((Control)this.tabPage).Enabled = false;
Run Code Online (Sandbox Code Playgroud)

因此,tabpage的标题仍将启用,但其内容将被禁用.

  • 为什么需要向下转换TabPage来控制?由于多态性,我们可以从TabPage调用Enabled属性. (7认同)
  • 我认为这忽略了禁用标签本身的重点.用户不应该能够选择它并查看内容. (3认同)
  • 这可能是您的用例,但我认为如果由于某些权限,标签需要是只读的,那么它很有用. (3认同)
  • 不知道它是否曾经有所不同,但今天它完全是胡说八道。69 名支持者错了。哎哟.. (2认同)
  • 不。演员阵容是不必要的。当然,TabPage 根本没有被禁用:它可以被选中。 (2认同)

Han*_*ant 69

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

如果这些可用性问题与您无关,那么请记住该属性仍然有效,它只是隐藏在IntelliSense之外.如果FUD不舒服,那么你可以简单地这样做:

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

  • 我想知道什么是不允许切换标签可见性的背景故事 (2认同)

小智 63

你可以简单地使用:

tabPage.Enabled = false;
Run Code Online (Sandbox Code Playgroud)

此属性未显示,但它没有任何问题.

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

private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
    if (e.TabPageIndex < 0) return;
    e.Cancel = !e.TabPage.Enabled;
}
Run Code Online (Sandbox Code Playgroud)

  • +2表示不进行投射,-1表示将其作为一个全新的答案而不只是评论我的.:) (7认同)
  • 多么奇怪..这似乎也适用于`Visible`属性,虽然它在测试时似乎没有任何视觉效果. (2认同)

Sto*_*net 43

您可以注册"选择"事件并取消导航到标签页:

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

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

您还可以从tabControl1.TabPages集合中删除tabpage.这会隐藏标签页.

积分转到littleguru @ Channel 9.

  • 这是一个该死的绝妙解决方案! (2认同)

Ste*_*art 13

据推测,您希望在选项卡控件中看到选项卡,但您希望它被"禁用"(即灰色且不可选).没有内置支持,但您可以覆盖绘图机制以提供所需的效果.

这里提供了如何执行此操作的示例.

神奇的是来自呈现源的片段,以及DisableTab_DrawItem方法:

this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
Run Code Online (Sandbox Code Playgroud)

  • @Narthring It's dead again. (2认同)

rfm*_*tor 12

在禁用以下内容后,根据CédricGuillemette的答案进行扩展Control:

((Control)this.tabPage).Enabled = false;
Run Code Online (Sandbox Code Playgroud)

...你便可以处理TabControlSelecting事件为:

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


小智 7

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

tabControl1.Controls.Remove(tabPage2);
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*man 5

唯一的方法是捕获Selecting事件并阻止激活标签.