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

时间:2013-04-18 06:36:23

标签: c# winforms tabs

我想做一个测验,通过问题,记住在使用问题1时,其他人被禁用。单击“下一步”按钮后,它应直接更改为Q2,禁用Q1,依此类推。

如何禁用上一个标签并在点击“下一步”按钮后启用当前标签?

How do I keep the other tabs disabled?

4 个答案:

答案 0 :(得分:4)

可以通过索引访问Tab,如下所示:

tabControl.TabPages[0]

所以,假设您从选项卡1(索引= 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;

免责声明:这未经过测试,但它应该是这些内容。

您声明对于不包含Enabled定义的对象有错误 - 我的代码将每个标签页都标记为TabPage。但是我没有测试过它。

答案 1 :(得分:3)

如前所述,可以通过索引选择标签。

和以前一样,让我们​​禁用所有其他标签:

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

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

答案 2 :(得分:2)

另一种解决方案(我认为最简单):

  • 使用全局变量(此处为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);
        }
    }
    

答案 3 :(得分:0)

我按照这种方式:

i)具有currentIndex值的全局。

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

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

iv)更改NextButton Click事件中的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;
   }