有没有办法禁用TabControl中的选项卡?
25 回答
将 TabPage 转换为控件,然后将 Enabled 属性设置为 false。
((Control)this.tabPage).Enabled = false;
因此,标签页的标题仍将启用,但其内容将被禁用。
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;
此属性未显示,但它可以正常工作。
您可以对 Selecting 事件进行编程,TabControler
以使其无法更改为不可编辑的选项卡:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
您可以注册“选择”事件并取消导航到标签页:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
另一个想法是将标签页上的所有控件放在一个Panel控件中并禁用该面板!笑脸
您还可以从 tabControl1.TabPages 集合中删除标签页。那将隐藏标签页。
大概,您希望在选项卡控件中看到选项卡,但您希望它被“禁用”(即,灰色且不可选择)。对此没有内置支持,但您可以覆盖绘图机制以提供所需的效果。
此处提供了如何执行此操作的示例。
神奇之处在于提供的源代码片段和 DisableTab_DrawItem 方法:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
扩展 Cédric Guillemette 的答案,在您禁用Control
:
((Control)this.tabPage).Enabled = false;
...然后您可以将TabControl
'Selecting
事件处理为:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
这将删除标签页,但您需要在需要时重新添加它:
tabControl1.Controls.Remove(tabPage2);
如果您以后需要它,您可能希望在删除之前将其存储在临时标签页中,然后在需要时重新添加它。
唯一的方法是捕捉Selecting
事件并防止选项卡被激活。
我不得不在不久前处理这个问题。我从 TabPages 集合中删除了 Tab(我认为就是这样),并在条件发生变化时将其重新添加。但这只是在 Winforms 中,我可以保留标签直到我再次需要它。
最棘手的方法是使其父级等于 null (使选项卡单独没有父级):
tabPage.Parent = null;
当您想将其退回时(将在页面收集结束时退回):
tabPage.Parent = tabControl;
如果您想将其返回到您可以使用的页面中的特定位置:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
我过去删除了标签页以防止用户单击它们。这可能不是最好的解决方案,因为他们可能需要查看标签页是否存在。
使用事件和选项卡控件的属性,您可以在需要时启用/禁用您想要的。我使用了一个 bool,它可用于使用 tabControl 的 mdi 子表单类中的所有方法。
请记住,每次单击任何选项卡时都会触发选择事件。对于大量选项卡,“CASE”可能比一堆 if 更容易使用。
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;
}
}
}
您可以通过标签页来完成:tabPage1.Hide()、tabPage2.Show() 等。
用户无法单击选项卡进行导航,但他们可以使用两个按钮 (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;
}
我已经这样解决了这个问题:我有 3 个选项卡,如果他没有登录,我想将用户保留在第一个选项卡上,所以在我写的 TabControl 的 SelectingEvent 上
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
tabControl.TabPages.Remove(tabPage1);
这是一个老问题,但有人可能会从我的补充中受益。我需要一个 TabControl 来连续显示隐藏的选项卡(在当前选项卡上执行操作之后)。因此,我创建了一个快速类来继承并在加载时调用 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();
}
XtraTabPage.PageEnabled 属性允许您禁用某些页面。
如果我们在表单加载事件中写入this.tabpage.PageEnabled = false
,标签页将被禁用。
假设您有以下控件:
名称为 tcExemple 的 TabControl。
名称为 tpEx1 和 tpEx2 的标签页。
尝试一下:
将 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;
}
}
附加到 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);
}
}
}
这将使第二个选项卡不可点击。
我找不到这个问题的适当答案。似乎没有禁用特定选项卡的解决方案。我所做的是将特定选项卡传递给变量,并在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;
}
因此,您实际上并没有禁用该选项卡,但是当单击另一个选项卡时,它始终会将您返回到选定的选项卡。
在 C# 7.0 中,有一个名为Pattern Matching的新功能。您可以通过Type Pattern禁用所有选项卡。
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;
}
}
采用:
tabControl1.TabPages[1].Enabled = false;
通过编写此代码,标签页不会被完全禁用(无法选择),但它的内部内容将被禁用,我认为这可以满足您的需求。
解决方案非常简单。
删除/评论此行
this.tabControl.Controls.Add(this.YourTabName);
在 MainForm.cs 的 IntializeComponent() 方法中
MyTabControl.SelectedTab.Enabled = false;