如何禁用TabControl中的选项卡?

时间:2009-01-06 20:30:44

标签: c# winforms tabcontrol

有没有办法禁用TabControl中的标签?

我正在使用C#。

26 个答案:

答案 0 :(得分:85)

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

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

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

答案 1 :(得分:66)

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

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

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

答案 2 :(得分:61)

您可以简单地使用:

tabPage.Enabled = false;

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

您可以对TabControler上的选择事件进行编程,以便无法更改为不可编辑的标签:

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

答案 3 :(得分:42)

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

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

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

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

积分转到littleguru @ Channel 9

答案 4 :(得分:13)

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

如何执行此操作的示例是provided here

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

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

答案 5 :(得分:10)

在禁用Control之后,根据CédricGuillemette的答案进行扩展:

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

...然后,您可以将TabControl的{​​{1}}事件处理为:

Selecting

答案 6 :(得分:7)

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

tabControl1.Controls.Remove(tabPage2);

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

答案 7 :(得分:5)

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

答案 8 :(得分:1)

tabControl.TabPages.Remove(tabPage1);

答案 9 :(得分:1)

最棘手的方法是使其父级等于null(不使用父级单独制作选项卡):

 tabPage.Parent = null;

当你想要将它返回时(将在页面收集结束时将其返回):

tabPage.Parent = tabControl;

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

tabControl.TabPages.Insert(indexLocationYouWant, tabPage);

答案 10 :(得分:1)

你可以通过以下标签来实现:tabPage1.Hide(),tabPage2.Show()等。

答案 11 :(得分:1)

我不得不暂时处理这件事。我从TabPages集合中移除了Tab(我认为就是这样)并在条件发生变化时将其添加回来。但那只是在Winforms,我可以保持标签,直到我再次需要它。

答案 12 :(得分:0)

这是一个古老的问题,但是有人可能会从我的加入中受益。我需要一个TabControl,它将连续显示隐藏的选项卡(在当前选项卡上执行操作之后)。因此,我做了一个快速的类来继承并在Load上调用HideSuccessive():

public class RevealingTabControl : TabControl
{
    private Action _showNextRequested = delegate { };

    public void HideSuccessive()
    {
        var tabPages = this.TabPages.Cast<TabPage>().Skip(1);
        var queue = new ConcurrentQueue<TabPage>(tabPages);
        tabPages.ToList().ForEach(t => t.Parent = null);
        _showNextRequested = () =>
        {
            if (queue.TryDequeue(out TabPage tabPage))
                tabPage.Parent = this;
        };
    }

    public void ShowNext() => _showNextRequested();
}

答案 13 :(得分:0)

在C#7.0中,有一个名为模式匹配的新功能。您可以通过键入样式禁用所有标签。

foreach (Control control in Controls)
{
    // the is expression tests the variable and 
    // assigned it to a new appropriate variable type
    if (control is TabControl tabs)
    {
        tabs.Enabled = false;
    }
}

答案 14 :(得分:0)

我无法找到问题的正确答案。似乎没有解决方案来禁用特定选项卡。我所做的是将特定标签传递给变量,并在SelectedIndexChanged事件中将其重新设置为SelectedIndex

//variable for your specific tab 
int _TAB = 0;

//here you specify your tab that you want to expose
_TAB = 1;
tabHolder.SelectedIndex = _TAB;

private void tabHolder_SelectedIndexChanged(object sender, EventArgs e)
{
    if (_TAB != 0) tabHolder.SelectedIndex = _TAB;
}

因此,您实际上并未禁用该选项卡,但单击其他​​选项卡时,它始终会返回所选选项卡。

答案 15 :(得分:0)

解决方案非常简单。

删除/评论此行

sh
在MainForm.cs中的IntializeComponent()方法

答案 16 :(得分:0)

假设你有这些控件:

TabControl,名称为tcExemple。

名称为tpEx1和tpEx2的TabPages。

试一试:

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

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

添加到选择tcExemple事件代码如下:

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

它会使第二个标签不可点击。

答案 17 :(得分:0)

XtraTabPage.PageEnabled 属性允许您禁用某些页面。

答案 18 :(得分:0)

Vb.Net的rfnodulator答案:

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

答案 19 :(得分:0)

我已经解决了这个问题: 我有3个标签,如果他没有登录,我想让用户留在第一个标签页, 所以我在TabControl的SelectingEvent上写了

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

答案 20 :(得分:0)

用户无法单击选项卡进行导航,但他们可以使用两个按钮( Next Back )。如果不满足//条件,则用户无法继续下一个。

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

答案 21 :(得分:0)

使用事件和选项卡控件的属性,您可以根据需要启用/禁用所需内容。我使用了一个bool,它可用于正在使用tabControl的mdi子窗体类中的所有方法。

请记住,每次单击任何选项卡时都会触发选择事件。对于大量的标签,“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;
            }
        }
    }

答案 22 :(得分:0)

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

答案 23 :(得分:-1)

使用:

 tabControl1.TabPages[1].Enabled = false;

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

答案 24 :(得分:-1)

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

答案 25 :(得分:-2)

MyTabControl.SelectedTab.Enabled = false;