我想做一个测验,通过问题,请记住,在使用问题 1 时,其他问题被禁用。单击下一步按钮后,它应直接更改为 Q2,禁用 Q1,依此类推。
单击“下一步”按钮后,如何使其禁用上一个选项卡并保持当前选项卡处于启用状态?
另一个解决方案(我认为最简单的):
使用全局变量(此处为 currentSelectedTab)
使用事件选择
// currentSelectedTab is the Only Tab I want enabled.
TabPage currentSelectedTab = tabWizardControl.TabPages[0];
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;
}
}
唯一的缺点是它们看起来是可选的,这意味着它们不会变灰。如果您还希望外观看起来不可用,则必须自己执行此操作。
可以通过索引访问选项卡,如下所示:
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;
现在,当您按下 Next 按钮时,您想要禁用当前选项卡,启用下一个选项卡,然后转到下一个选项卡。但请记住检查选项卡是否存在!
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;
免责声明:这未经测试,但应该是这样的。
您说您收到关于不包含已启用定义的对象的错误 - 我的代码将每个标签页类型转换为 TabPage。但是我还没有测试过。
我遵循了这种方式:
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;
}