C# 如何禁用选项卡,以便用户无法更改它?

C# 如何禁用选项卡,以便用户无法更改它?,c#,winforms,tabs,C#,Winforms,Tabs,我想做一个小测验,对所有问题进行测试,记住,当使用问题1时,其他问题是禁用的。单击“下一步”按钮后,应直接更改为Q2,禁用Q1,以此类推 单击“下一步”按钮后,如何使其禁用上一个选项卡并保持当前选项卡处于启用状态 选项卡可以通过其索引访问,如下所示: tabControl.TabPages[0] 因此,假设您从选项卡1(index=0)开始,您希望禁用所有其他选项卡 // This can be done manually in the designer as well. foreach(Ta

我想做一个小测验,对所有问题进行测试,记住,当使用问题1时,其他问题是禁用的。单击“下一步”按钮后,应直接更改为Q2,禁用Q1,以此类推

单击“下一步”按钮后,如何使其禁用上一个选项卡并保持当前选项卡处于启用状态


选项卡可以通过其索引访问,如下所示:

tabControl.TabPages[0]
因此,假设您从选项卡1(index=0)开始,您希望禁用所有其他选项卡

// This can be done manually in the designer as well.
foreach(TabPage tab in tabControl.TabPages)
{
    tab.Enabled = false;
}
(tabControl.TabPages[0] as TabPage).Enabled = true;
现在,当您按下“下一步”按钮时,您希望禁用当前选项卡,启用下一个选项卡,然后转到下一个选项卡。但请记住检查该选项卡是否存在

if(tabControl.TabCount - 1 == tabControl.SelectedIndex)
  return; // No more tabs to show!

tabControl.SelectedTab.Enabled = false;
var nextTab = tabControl.TabPages[tabControl.SelectedIndex+1] as TabPage;
nextTab.Enabled = true;
tabControl.SelectedTab = nextTab;
免责声明:这没有经过测试,但应该是这样的

您声明,您遇到了一个关于对象未包含已启用的定义的错误-我的代码类型将每个选项卡页转换为选项卡页。但是,我没有测试它。

我是这样做的:

i) 具有currentIndex值的全局变量

ii)将SelectedIndexChanged事件处理程序添加到tabControl

iii)在SelectedIndexChanged处理程序中,将索引设置回currentIndex

iv)在下一个按钮单击事件中更改currentIndex

这可能会起作用:

   currentIndex = 0; //global initial setting

   tabControl1.SelectedIndexChanged += new EventHandler(tabControl1_SelectedIndexChanged);

   void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
   {
       tabControl1.SelectedIndex = currentIndex;
       return;
   }

   private void nextButton_Click(object sender, EventArgs e)
   {
       currentIndex += 1;

       if (currentIndex >= tabControl1.TabPages.Count)
       {
           currentIndex = 0;
       }

       foreach (TabPage pg in tabControl1.TabPages)
       {
           pg.Enabled = false;
       }

       tabControl1.TabPages[currentIndex].Enabled = true;
       tabControl1.SelectedIndex = currentIndex;
   }
另一个解决方案(我认为是最简单的):

  • 使用全局变量(此处为currentSelectedTab)
  • 使用事件选择

    private void tabWizardControl_Selecting(object sender, TabControlCancelEventArgs e)
    {
        int selectedTab = tabWizardControl.SelectedIndex;
        //Disable the tab selection
        if (currentSelectedTab != selectedTab)
        {
            //If selected tab is different than the current one, re-select the current tab.
            //This disables the navigation using the tab selection.
            tabWizardControl.SelectTab(currentSelectedTab);
        }
    }
    

如前所述,可以通过索引选择选项卡

与前面一样,让我们禁用所有其他选项卡:

foreach(TabPage tab in tabControl.TabPages)
{
    tab.Enabled = false;
}
(tabControl.TabPages[0] as TabPage).Enabled = true;
现在,防止导航到任何其他选项卡的方法很简单:

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

唯一的缺点是它们将显示为可选,这意味着它们不会变灰。如果希望外观看起来也不可用,则必须自己执行此操作。

它告诉我“对象”不包含已启用的定义:\我开始认为标签不能被禁用。另外,根据
的规定,Enabled
不在选项卡中起任何作用。我主张将其删除,因为这显然不能解决问题,而且完全不起作用,完全不正确,并且有点侮辱性,因为它被提议为“沿着这些路线的东西”,尽管它没有经过测试,甚至没有参考文档(这说明它是错误的)。对于“禁用”选项卡,您可以使用设置
e.Cancel=true
。但是,除非您自己绘制选项卡,否则这些选项卡实际上不会显示为禁用(灰显)。我可能会完全删除这些选项卡,并在用户进行测验时添加它们。