Como posso desativar uma guia dentro de um TabControl?
-
03-07-2019 - |
Pergunta
Existe uma maneira para desativar um guia em uma TabControl ?
Eu estou usando C #.
Solução
O TabPage couros classe a propriedade Enabled. Isso foi intencional, pois há um problema de design de UI estranho com ele. A questão básica é que a desativação da página também não desativar a guia. E se tentar resolver isso desativando a guia com o evento Selecionando então ele não funciona quando o TabControl tem apenas uma página.
Se estes problemas de usabilidade não lhe diz respeito, em seguida, ter em mente que a propriedade ainda funciona, é apenas escondido de IntelliSense. Se o FUD é desconfortável, então você pode simplesmente fazer isso:
public static void EnableTab(TabPage page, bool enable) {
foreach (Control ctl in page.Controls) ctl.Enabled = enable;
}
Outras dicas
Elenco sua TabPage a um controle, em seguida, defina a propriedade Enabled para false.
((Control)this.tabPage).Enabled = false;
Portanto, o cabeçalho do TabPage ainda será ativado, mas o seu conteúdo será desativado.
Você pode simplesmente usar:
tabPage.Enabled = false;
Esta propriedade não é mostrado, mas funciona sem problemas.
Você pode programar o evento Seleção em TabControler
para tornar impossível para mudar para um separador não editável:
private void tabControler_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPageIndex < 0) return;
e.Cancel = !e.TabPage.Enabled;
}
Você poderia registrar o evento "Seleção" e cancelar a navegação para a página de guia:
private void tabControl1_Selecting(object sender, TabControlCancelEventArgs e)
{
if (e.TabPage == tabPage2)
e.Cancel = true;
}
Outra idéia é colocar todos os controles do TabPage em um controle Panel e desativar o painel! Smiley
Você também pode remover o TabPage da coleção tabControl1.TabPages. Isso iria esconder TabPage.
Os créditos vão para littleguru @ Channel 9 .
Provavelmente, você quer ver o guia no controle guia, mas você quer que ele seja "desativado" (ou seja, cinzento, e unselectable). Não há nenhum suporte embutido para isso, mas você pode substituir o mecanismo de desenho para dar o efeito desejado.
Um exemplo de como fazer isso é fornecido aqui .
A magia está neste trecho da fonte apresentado, e no método DisableTab_DrawItem:
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.DrawItem += new DrawItemEventHandler( DisableTab_DrawItem );
Estendendo mediante resposta Cédric Guillemette, depois de desactivar o Control
:
((Control)this.tabPage).Enabled = false;
... então você pode manipular o evento TabControl
do Selecting
como:
private void tabControl_Selecting(object sender, TabControlCancelEventArgs e)
{
e.Cancel = !((Control)e.TabPage).Enabled;
}
Isto irá remover a página da guia, mas você precisa adicioná-lo novamente quando você precisar dele:
tabControl1.Controls.Remove(tabPage2);
Se você vai precisar dele mais tarde, você pode querer armazená-lo em um TabPage temporário antes de o remover e, em seguida, adicioná-lo novamente quando necessário.
A única maneira é a de capturar o evento Selecting
e impedir um separador de ser activado.
Eu tive que lidar com isso um tempo atrás. Eu removi o Tab da coleção TabPages (acho que é isso) e adicionou-o novamente quando as condições mudaram. Mas isso foi apenas em WinForms onde eu poderia manter a guia ao redor até que eu precisava-lo novamente.
Você pode fazê-lo através das TabPages:. TabPage1.Hide (), tabPage2.Show () etc
tabControl.TabPages.Remove (TabPage1);
A maneira mais complicado é fazer com que seu pai é igual a nulo (fazer o guia sozinho, sem pai):
tabPage.Parent = null;
E quando você quiser devolvê-lo de volta (vai devolvê-lo de volta no final da coleta de páginas):
tabPage.Parent = tabControl;
E se você quiser devolvê-lo de volta em um local específico entre as páginas que você pode usar:
tabControl.TabPages.Insert(indexLocationYouWant, tabPage);
Eu removi no passado para impedir que o usuário clique sobre elas. Isso provavelmente não é a melhor solução, porque embora eles podem precisar de ver que a página da guia existe.
Usando eventos e as propriedades do controle guia, você pode ativar / desativar o que você quiser, quando quiser. Eu usei um bool que está disponível para todos os métodos na MDI classe formulário filho onde o tabControl está sendo usado.
Lembre-se dos eventos incêndios selecionando cada vez que qualquer guia é clicado. Para um grande número de guias um "caso" pode ser mais fácil de usar do que um monte de 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;
}
}
}
Eu já resolveu este problema como este: Eu tenho 3 guias e eu quero manter usuário na primeira guia se ele não entrar, assim por diante o SelectingEvent de TabControl eu escrevi
if (condition) { TabControl.Deselect("2ndPage"); TabControl.Deselect("3dPage"); }
O usuário não pode clicar em abas para navegar, mas eles podem utilizar os dois botões ( Seguinte e Voltar ). O usuário não pode continuar para a próxima se as condições // não são cumpridos.
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;
}
resposta rfnodulator para Vb.Net:
Private Sub TabControl1_Selecting(sender As Object, e As TabControlCancelEventArgs) Handles TabControl1.Selecting
e.Cancel = Not e.TabPage.Enabled
End Sub
Suponha que você tenha esses controles:
TabControl com o nome tcExemple.
TabPages com nomes tpEx1 e tpEx2.
Experimente:
Set DrawMode do seu TabPage para OwnerDrawFixed; Depois de InitializeComponent (), certifique-se de que tpEx2 não permitir adicionando este código:
((Control)tcExemple.TabPages["tpEx2").Enabled = false;
Adicionar ao evento Seleção tcExemple o código abaixo:
private void tcExemple_Selecting(object sender, TabControlCancelEventArgs e)
{
if (!((Control)e.TabPage).Enabled)
{
e.Cancel = true;
}
}
Anexar para DrawItem evento de tcExemple este código:
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);
}
}
}
Isso fará com que non-clickable a segunda aba.
A solução é muito simples.
Remover / comentar esta linha
this.tabControl.Controls.Add(this.YourTabName);
em IntializeComponent () método em MainForm.cs
Eu não poderia encontrar uma resposta adequada para a questão. Não parece haver nenhuma solução para desativar a guia específica. O que eu fiz é passar a guia específico para uma variável e, em caso SelectedIndexChanged
colocá-lo de volta para 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;
}
Então, você realmente não desativar a guia, mas quando outra guia é clicado ele sempre retorna para a guia selecionada.
No evento de carregamento do formulário se escrevermos this.tabpage.PageEnabled = false
, o TabPage será desativado.
Use:
tabControl1.TabPages[1].Enabled = false;
Ao escrever este código, a página de guia não será completamente desativado (não ser capaz de selecionar), mas o seu conteúdo interno será desativado que eu acho que satisfazer suas necessidades.
MyTabControl.SelectedTab.Enabled = false;