Pergunta

Existe uma maneira para desativar um guia em uma TabControl ?

Eu estou usando C #.

Foi útil?

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);
páginas de guia

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top