我如何禁用TabControl内的选项卡?
有没有一种方法来禁用TabControl中的选项卡?
我正在使用C#。
TabPage类隐藏启用属性。 这是故意的,因为它有一个尴尬的UIdevise问题。 基本的问题是,禁用页面也不会禁用该选项卡。 如果尝试通过禁用select事件选项卡来解决该问题,那么当TabControl只有一个页面时它不起作用。
如果这些可用性问题不关心,那么请记住,该属性仍然有效,它只是隐藏在智能感知中。 如果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;
此属性不显示,但它没有任何问题。
您可以在TabControler
对select事件进行编程,使其无法更改为不可编辑的选项卡:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e) { e.Cancel = !e.TabPage.Enabled; }
您可以注册“select”事件并取消导航到标签页:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e) { if (e.TabPage == tabPage2) e.Cancel = true; }
另一个想法是将所有的控件放在Panel控件的tabpage上并禁用面板! 斯迈利
您也可以从tabControl1.TabPages集合中删除tabpage。 这将隐藏tabpage。
学分转到littleguru @频道9 。
据推测,你想看到在选项卡控制选项卡,但你希望它是“禁用”(即灰色,不可选)。 没有对此的内置支持,但是您可以覆盖绘图机制以提供所需的效果。
这里提供了一个如何做到这一点的例子。
神奇的是在这个源代码片段中,在DisableTab_DrawItem方法中:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed; this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
扩展CédricGuillemette答案后,禁用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中,我可以保持这个标签,直到我再次需要它。
你可以通过tabpage:tabPage1.Hide(),tabPage2.Show()等
tabControl.TabPages.Remove(tabPage1);
最棘手的方法是使其父母等于空(使标签独自没有父母):
tabPage.Parent = null;
并且当你想返回时(将在页面收集结束时返回):
tabPage.Parent = tabControl;
如果您想将其返回到您可以使用的页面中的特定位置:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
我已经删除过去的标签页,以防止用户点击它们。 这可能不是最好的解决scheme,因为他们可能需要看到标签页存在。
使用事件以及选项卡控件的属性,可以在需要时启用/禁用所需内容。 我使用了一个bool,可用于所有使用tabControl的mdi子表单类中的所有方法。
记住select事件每次点击任何标签时触发。 对于大量的标签,“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; } } }
我已经解决了这样的问题:我有3个选项卡,我想保持在第一个标签的用户,如果他没有login,所以在TabControl的SelectingEvent我写
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
用户不能点击标签进行导航,但可以使用两个button(“ 下一步”和“ 后退” )。 如果不符合//条件,用户将无法继续下一步。
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的TabPages。
尝试一下:
将您的TabPage的DrawMode设置为OwnerDrawFixed; 在InitializeComponent()之后,确保通过添加下面的代码来启用tpEx2:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
添加到selecttcExemple事件的代码如下:
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); } } }
这将使第二个标签不可点击。
在表单加载事件中,如果我们写this.tabpage.PageEnabled = false
,tabpage将被禁用。
使用:
tabControl1.TabPages[1].Enabled = false;
通过编写这个代码,标签页将不会被完全禁用(不能select),但其内部的内容将被禁用,我认为满足您的需求。
MyTabControl.SelectedTab.Enabled = false;