有没有办法禁用TabControl中的标签?
我正在使用C#。
答案 0 :(得分:85)
将TabPage转换为Control,然后将Enabled属性设置为false。
((Control)this.tabPage).Enabled = false;
因此,标签页的标题仍会启用,但其内容将被禁用。
答案 1 :(得分:66)
TabPage类隐藏了Enabled属性。这是故意的,因为它有一个尴尬的UI设计问题。基本问题是禁用页面也不会禁用选项卡。如果尝试通过使用Selecting事件禁用选项卡来解决这个问题,那么当TabControl只有一个页面时它就不起作用。
如果这些可用性问题与您无关,请记住该属性仍然有效,它只是隐藏在IntelliSense之外。如果FUD不舒服,那么你可以简单地这样做:
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
答案 2 :(得分:61)
您可以简单地使用:
tabPage.Enabled = false;
此属性未显示,但它没有任何问题。
您可以对TabControler
上的选择事件进行编程,以便无法更改为不可编辑的标签:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
答案 3 :(得分:42)
您可以注册“选择”事件并取消导航到标签页:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
另一个想法是将所有控件放在Panel控件的tabpage上并禁用面板!笑脸
您还可以从tabControl1.TabPages集合中删除tabpage。这会隐藏标签页。
答案 4 :(得分:13)
据推测,您希望在选项卡控件中看到选项卡,但您希望它被“禁用”(即灰色且不可选)。没有内置支持,但您可以覆盖绘图机制以提供所需的效果。
如何执行此操作的示例是provided here。
神奇的是来自呈现源的片段,以及DisableTab_DrawItem方法:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
答案 5 :(得分:10)
在禁用Control
之后,根据CédricGuillemette的答案进行扩展:
((Control)this.tabPage).Enabled = false;
...然后,您可以将TabControl
的{{1}}事件处理为:
Selecting
答案 6 :(得分:7)
这将删除标签页,但您需要在需要时重新添加标签页:
tabControl1.Controls.Remove(tabPage2);
如果您以后需要它,您可能希望在删除之前将其存储在临时标签页中,然后在需要时重新添加。
答案 7 :(得分:5)
唯一的方法是捕获Selecting
事件并阻止激活标签。
答案 8 :(得分:1)
tabControl.TabPages.Remove(tabPage1);
答案 9 :(得分:1)
最棘手的方法是使其父级等于null(不使用父级单独制作选项卡):
tabPage.Parent = null;
当你想要将它返回时(将在页面收集结束时将其返回):
tabPage.Parent = tabControl;
如果您想将其返回到您可以使用的页面中的特定位置:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
答案 10 :(得分:1)
你可以通过以下标签来实现:tabPage1.Hide(),tabPage2.Show()等。
答案 11 :(得分:1)
我不得不暂时处理这件事。我从TabPages集合中移除了Tab(我认为就是这样)并在条件发生变化时将其添加回来。但那只是在Winforms,我可以保持标签,直到我再次需要它。
答案 12 :(得分:0)
这是一个古老的问题,但是有人可能会从我的加入中受益。我需要一个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();
}
答案 13 :(得分:0)
在C#7.0中,有一个名为模式匹配的新功能。您可以通过键入样式禁用所有标签。
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;
}
}
答案 14 :(得分:0)
我无法找到问题的正确答案。似乎没有解决方案来禁用特定选项卡。我所做的是将特定标签传递给变量,并在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;
}
因此,您实际上并未禁用该选项卡,但单击其他选项卡时,它始终会返回所选选项卡。
答案 15 :(得分:0)
解决方案非常简单。
删除/评论此行
sh
答案 16 :(得分:0)
假设你有这些控件:
TabControl,名称为tcExemple。
名称为tpEx1和tpEx2的TabPages。
试一试:
将TabPage的DrawMode设置为OwnerDrawFixed; 在InitializeComponent()之后,通过添加以下代码确保未启用tpEx2:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
添加到选择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);
}
}
}
它会使第二个标签不可点击。
答案 17 :(得分:0)
XtraTabPage.PageEnabled 属性允许您禁用某些页面。
答案 18 :(得分:0)
Vb.Net的rfnodulator答案:
Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
e.Cancel = Not e.TabPage.Enabled
End Sub
答案 19 :(得分:0)
我已经解决了这个问题: 我有3个标签,如果他没有登录,我想让用户留在第一个标签页, 所以我在TabControl的SelectingEvent上写了
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
答案 20 :(得分:0)
用户无法单击选项卡进行导航,但他们可以使用两个按钮( 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;
}
答案 21 :(得分:0)
使用事件和选项卡控件的属性,您可以根据需要启用/禁用所需内容。我使用了一个bool,它可用于正在使用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;
}
}
}
答案 22 :(得分:0)
我过去删除过标签页以防止用户点击它们。这可能不是最好的解决方案,因为他们可能需要看到标签页存在。
答案 23 :(得分:-1)
使用:
tabControl1.TabPages[1].Enabled = false;
通过编写此代码,标签页将不会被完全禁用(无法选择),但其内部内容将被禁用,我认为这些内容满足您的需求。
答案 24 :(得分:-1)
如果我们写this.tabpage.PageEnabled = false
,则在表单加载事件中,标签页将被禁用。
答案 25 :(得分:-2)
MyTabControl.SelectedTab.Enabled = false;