有没有办法禁用TabControl中的选项卡?
Answers:
在TabPage的类隐藏Enabled属性。这是故意的,因为它存在一个尴尬的UI设计问题。基本问题是禁用页面不会同时禁用选项卡。并且,如果尝试通过使用Selecting事件禁用选项卡来解决此问题,则当TabControl只有一页时,它将不起作用。
如果您不关心这些可用性问题,那么请记住,该属性仍然有效,它只是对IntelliSense隐藏。如果FUD不舒服,则只需执行以下操作:
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
将您的TabPage强制转换为控件,然后将Enabled属性设置为false。
((Control)this.tabPage).Enabled = false;
因此,选项卡页的标题仍将启用,但其内容将被禁用。
您可以简单地使用:
tabPage.Enabled = false;
该属性未显示,但可以正常使用。
您可以对Selecting事件进行编程,TabControler
以使其无法更改为不可编辑的标签:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
Visible
尽管这在我测试时似乎并没有任何视觉效果,但这似乎也确实适用于该属性。
您可以注册“正在选择”事件并取消导航到标签页:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
另一个想法是将所有控件放在面板控件的选项卡页上,然后禁用面板!笑脸
您也可以从tabControl1.TabPages集合中删除选项卡页。那会隐藏标签页。
大概是,您希望在选项卡控件中看到该选项卡,但是希望它被“禁用”(即,灰色且不可选择)。对此没有内置支持,但是您可以覆盖绘图机制以提供所需的效果。
这里提供了如何执行此操作的示例。
所显示的源代码中的这段代码以及DisableTab_DrawItem方法中的妙处在于:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
这将删除标签页,但是您需要在需要时重新添加它:
tabControl1.Controls.Remove(tabPage2);
如果以后要使用它,可能要在删除之前将其存储在一个临时选项卡中,然后在需要时重新添加它。
唯一的方法是捕获Selecting
事件并阻止选项卡被激活。
最棘手的方法是使其父级等于null(使制表符不带父级):
tabPage.Parent = null;
而当您想将其退回时(将在页面集合的末尾将其退回):
tabPage.Parent = tabControl;
如果要在页面中的特定位置返回它,可以使用:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
tabControl.TabPages.Remove(tabPage1);
使用事件和选项卡控件的属性,可以在需要时启用/禁用所需的内容。我使用了一个布尔值,该布尔值可用于正在使用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;
}
}
}
用户无法单击选项卡进行导航,但可以使用两个按钮(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;
}
Vb.Net的rfnodulator答案:
Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
e.Cancel = Not e.TabPage.Enabled
End Sub
假设您具有以下控件:
名为tcExemple的TabControl。
名为tpEx1和tpEx2的TabPage。
尝试一下:
将TabPage的DrawMode设置为OwnerDrawFixed; 在InitializeComponent()之后,通过添加以下代码来确保未启用tpEx2:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
将以下代码添加到Selection tcExemple事件中:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
{
if (!((Control)e.TabPage).Enabled)
{
e.Cancel = true;
}
}
将以下代码附加到tc的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);
}
}
}
这将使第二个选项卡不可单击。
这是一个老问题,但是有人可能会从我的加入中受益。我需要一个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();
}
如果我们写表单加载事件this.tabpage.PageEnabled = false
,则选项卡页将被禁用。
解决方案非常简单。
删除/注释此行
this.tabControl.Controls.Add(this.YourTabName);
在MainForm.cs中的IntializeComponent()方法中
我找不到这个问题的适当答案。似乎没有解决方案来禁用特定选项卡。我所做的是将特定的选项卡传递给变量,并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;
}
因此,您实际上并没有禁用该选项卡,但是当单击另一个选项卡时,它总是使您返回到选定的选项卡。