none
Como evitar que uma TabPage seja selecionada ? RRS feed

  • Pergunta

  • Bom dia !

     

    Tenho um TabControl com 3 TabPages. Acontece que no momento da inclusão quero evitar que o usuário acesse a segunda tabpage sem que antes preencha alguns dados da primeira.

    Utilizei o seguinte código para fazer isto:

     

    If TabControl1.SelectedTab.Name = "TabPage2" Then

    If txtNome.Text = "" Then

    MessageBox.Show("Primeiro informe os dados principais do produto !", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)

    TabControl1.SelectedTab = TabPage1

    End If

    End If

     

    Coloquei este código no evento SelectedIndexChanged do TabControl. Quando clico na segunda tabpage a mensagem aparece, mas a tabpage é selecionada.

    Tentei inserir o código no evento Click do TabControl, mas o resultado foi o mesmo. E no evento Click da própria tabpage2 não funciona.

    Será que tem algum evento que execute este código sem que ative a tabpage ? Ou alguma outra maneira ?

     

    Obrigado,

     

    Marcos


     

     

    quarta-feira, 21 de novembro de 2007 14:46

Todas as Respostas

  • Caro colega, tente usar o comando a seguir:

     

    Code Block
    TabControl1.SelectedTab = TabControl1.TabPages(0)

     

     

     

    Espero ter ajudado!

     

    Atenciosamente.

    quarta-feira, 21 de novembro de 2007 16:35
  • Marcos,

     

    Force o TabControl a selecionar a TabPage1 antes do MessageBox. Deixe o código do SelectedIndexChanged mesmo...

     

    If TabControl1.SelectedTab.Name = "TabPage2" Then

    If txtNome.Text = "" Then

    TabControl1.SelectedTab = TabPage1

    MessageBox.Show("Primeiro informe os dados principais do produto !", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)

    End If

    End If

     

    Olha se vai resolver dessa forma.

     

    Espero poder ter ajudado.

     

    Caso essa resposta seja útil, marque-a como tal.

    quarta-feira, 21 de novembro de 2007 17:02
  • É Terence, melhorou um pouco. Mas tá bom, já que não temos como desabilitar uma tabpage (pelo menos até hoje não encontrei nada na net que pudesse fazer isso, apenas um classe, que não funcionou também). A resposta que mais encontrei foi para colocar os controles da tabpage dentro de um panel e desabilitá-lo quando necessário.

    Mas por enquanto vai assim mesmo.

    A classe que encontrei está neste endereço: http://bethmassi.blogspot.com/2005/01/disable-tabs-on-tabcontrol.html, mas não tem a propriedade Enabled como mostra no exemplo. Se alguém conseguir utilizá-la a contento, por favor, avise.

     

    Obrigado,

     

    Marcos

    quarta-feira, 21 de novembro de 2007 20:35
  • A classe funciona. O sujeito do blog apenas colocou o exemplo em "pseudocode".

     

    Tente assim, substituindo pelos nomes reais que vc usa:

     

    SeuTabControl.TabPages("SuaTabPage").Enabled = False

     

    quarta-feira, 21 de novembro de 2007 21:49
  • Já tentei isto também, mas não aparece a propriedade Enabled !

     

    Obrigado,

     

    Marcos

    quarta-feira, 21 de novembro de 2007 21:54
  • A propriedade está lá, só está oculta já que supostamente não é para ser usada diretamente. Veja:

     

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=1328146&SiteID=21

     

    quarta-feira, 21 de novembro de 2007 22:41
  • Angus, pelo que entendi você está se referindo a esconder a tabpage. Isto eu já fazia, mas não ficou nada legal, porque depois de uma inclusão ou alteração tenho que carregar novamente os datasets e o form que estava escondido vai aparecendo em câmera lenta. Fica feio. Então resolvi tirar isto do sistema. O que quero mesmo é desabilitar a tabpage, assim como se desabilita um textbox. Se não tiver jeito, fazer o que né ?!

     

    Obrigado,

     

    Marcos

    quarta-feira, 21 de novembro de 2007 22:52
  • Não, eu não estou me referindo a esconder a TabPage. Com aquela classe que está no blog que você linkou a TabPage será desabilitada: você não conseguirá selecioná-la (o texto da aba tb ficará acinzentado para indicar a desabilitação etc.).

     

    (O TabControl que está linkado na minha mensagem anterior tb faz isso, mas o controle é bem maior e não vem com fontes, apesar de o uso ser grátis).

     

    Coloque a classe num arquivo e teste. Funciona.

     

    quinta-feira, 22 de novembro de 2007 09:38
  • Bom dia!

     

    O procedimento abaixo, só vai deixar sair da Tab quando ela for preenchida de acordo com a parametrização que você definir

     

    Valida os Campos e Retorna o Valor da Tab Selecionada

    Private ActiveTab As Integer = 0

     

    Private Sub TabControl1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabControl1.SelectedIndexChanged

    If Valid_Campos()= True Then

    Me.TabControl1.SelectedIndex = ActiveTab

    Exit Sub

    End If

    ActiveTab = Me.TabControl1.SelectedIndex

    End Sub

     

     

    Valida os Campos da Maneira que for parametrizada.

    Private Function Valid_Campos() As Boolean

    If Me.txtNome.Text.Trim() = "" Then

    SetCorControles(Me.txtNome, "Aviso","Primeiro informe os dados principais do produto !")

    Return True

    Exit Function

    Else

    Me.txtNome.BackColor = Drawing.Color.White

    End If

    End Sub

     

    Insira o código abaixo em modulo

    Public Sub SetCorControles(ByVal txt As Control, ByVal _Title As String, ByVal _MSG As String)

    If TypeOf (txt) Is TextBox Then

    Dim txtB As TextBox = DirectCast(txt, TextBox)

    MsgBox(_MSG, MsgBoxStyle.ApplicationModal + MsgBoxStyle.Exclamation, _Title)

    Selecionar(txt)

    txt.Focus()

    txt.BackColor = Drawing.Color.Salmon

    ElseIf TypeOf (txt) Is MaskedTextBox Then

    MsgBox(_MSG, MsgBoxStyle.ApplicationModal + MsgBoxStyle.Exclamation, _Title)

    txt.Focus()

    Selecionar(txt)

    txt.BackColor = Drawing.Color.Salmon

    ElseIf TypeOf (txt) Is ComboBox Then

    MsgBox(_MSG, MsgBoxStyle.ApplicationModal + MsgBoxStyle.Exclamation, _Title)

    txt.Focus()

    Selecionar(txt)

    txt.BackColor = Drawing.Color.Salmon

    End If

    End Sub

    Public Sub Selecionar(ByVal txt As Control)

    If TypeOf (txt) Is TextBox Then

    Dim txtB As TextBox = DirectCast(txt, TextBox)

    txtB.SelectionStart = 0

    txtB.SelectionLength = txtB.Text.Length

    ElseIf TypeOf (txt) Is MaskedTextBox Then

    Dim txtM As MaskedTextBox = DirectCast(txt, MaskedTextBox)

    txtM.SelectionStart = 0

    txtM.SelectionLength = txtM.Text.Length

    ElseIf TypeOf (txt) Is ComboBox Then

    Dim txtM As ComboBox = DirectCast(txt, ComboBox)

    txtM.SelectionStart = 0

    txtM.SelectionLength = txtM.Text.Length

    End If

    End Sub

     

    Qualquer dúvida é só me perguntar!
    quinta-feira, 22 de novembro de 2007 10:39
  • Angus, funcionou (dããã) !

     

    É que como não vi a propriedade Enabled no intellisense acabei nem testando.

     

    Só o visual das tabs que não é estilo XP.

     

     

    Obrigado a todos pela ajuda !

     

     

    Marcos

     

    quinta-feira, 22 de novembro de 2007 13:10
  • Veja o TabControl do link abaixo:

     

    http://www.vbdotnetheaven.com/UploadFile/Pankaj.Patel/TabControlAppliedVisualStyle04102006005718AM/TabControlAppliedVisualStyle.aspx?MessageChildID=701&Delete=true

     

    Ele aplica o estilos visuais etc. Simplesmente adicione as rotinas do outro TabControl necessárias para obter o efeito de desabilitar a TabPage.

    quinta-feira, 22 de novembro de 2007 15:36
  • Valeu Carlos, seu código também foi proveitoso. Só que não tem jeito, tanto faz colocar o código no evento SelectedIndexChanged ou Click, a aba fica visível e somente depois da mensagem volta para a outra aba. Mas também ficou legal assim. Outra coisa é que após a validação do campo, caso ele esteja vazio o foco não volta para ele e sim para o campo anterior.

     

    Obrigado,

     

    Marcos

     

    quinta-feira, 22 de novembro de 2007 20:06
  • Olá a Todos, esse tópico parece meio antigo hehe, mas vou postar pois utilizei uma solução diferente das citadas.

    na propriedade TAG de CADA tabpage (cuidado para não colocar no tabcontrol) atribua um valor, ex: 1, 2 e 3

    no evento SELECTING do Tabcontrol faça:

    If (TabControl1.SelectedTab.Tag = 1) Then
                e.Cancel = True
    ElseIf (TabControl1.SelectedTab.Tag = 2) Then
                e.Cancel = True
    End If

    isso irá proibir que o usuário acesse outras tabs

    então você faz as validações para que se os campos todos estiverem corretos, altere o valor da TAG

    exemplo: se todos os campos da TAB1 estiverem corretos então
                         
    TabControl1.SelectedTab.Tag = 4
                     fecha if


    e no inicio para fazer a verificação coloquei:
    se o
    TabControl1.SelectedTab.Tag = 4 então
      
    TabControl1.SelectedTab.Tag = 2
    fecha se

    porque se não a TAG ficará com 4, e quando validar de novo não funcionará, entendes?

    é isso

    abraço
    terça-feira, 29 de julho de 2008 13:21
  • Olá só para que fique registrado mas para desabilita um TabPage se usa o hide para desabilitar e o show para habilita..

    dim v as boolean

    if v = flase then

    TabPage2.Hide()

    else

    TabPage2.show()

    end if

    quinta-feira, 12 de dezembro de 2013 18:16
  • Olá,

    Tente colocar este código no evento Click da TabPage e acrescente o bloco abaixo:

    TabControl1.SelectedTab = "TabPage1"

    Ao clicar na TabPage2 ele vai verificar se o TextBox está em branco e irá retornar para a TabPage1.

    Abraço!


    Paulo Lucio Cardozo Neto



    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 6 de maio de 2014 13:22
  • Tente inserir seu código na propriedade Selecting do TabControl e adicione e.Cancel = true ao invés de TabControl1.SelectedTab = TabPage1. 

    Dessa forma a seleção da tab é cancelada. fica assim:

    If TabControl1.SelectedTab.Name = "TabPage2" Then

    If txtNome.Text = "" Then

    MessageBox.Show("Primeiro informe os dados principais do produto !""Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)

    //TabControl1.SelectedTab = TabPage1

    e.Cancel = true;

    End If

    End If

    OBS.: Testei em C#, mas acho que também resolve.

    Espero ter ajudado.

    Atenciosamente.

    domingo, 4 de janeiro de 2015 20:41