none
TabControl + TabPage + Tecla TAB = Problema com foco

    Question

  • Olá,

    Fiz um formulário (windows forms) que contém um tabcontrol com algumas abas, eu quero que qdo o usuário tecle tab no último controle de uma aba ele passe pra outra, até ai tudo bem foi bem simples e funcionou com o seguinte:

                if (e.KeyCode == Keys.Tab)
                    tabAdicionais.SelectedTab = tbpValores;

    O problema é que ele sempre foca o SEGUNDO controle da próxima aba, eu ja tentei colocar tabindex 0, 1, etc no primeiro controle.. ja tentei:

                if (e.KeyCode == Keys.Tab) {
                    tabAdicionais.SelectedTab = tbpValores;
                    TextBox.Focus();
                }

    Mas nada funciona, ele SEMPRE foca o segundo controle dentro da próxima tab, eu imagino que seja pq ele envia a tecla tab q eu pressionei e ja muda o controle, mas como to usando o evento PreviewKeyDown, não consegui cancelar a tecla...

    Alguem tem alguma sugestão?


    Obrigado,

    -Fábio.
    Wednesday, July 05, 2006 4:57 PM

Answers

  • Estava com o mesmo problema aqui, mas após passar um bom tempo quebrando a cabeça eu observei que este problema pode ser resolvido da seguinte forma:

            private void txtTelefone_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)

    {

                if (e.KeyCode == Keys.Tab || e.KeyCode == Keys.Enter)

                {

                    this.tabAbas.SelectedTab = this.tabAdministrativo;

                    this.tabAbas.Focus();

                }

            }

     

    No caso eu coloquei também o Keys.Enter porque faço o tratamento no KeyDown para que o Enter funcione como Tab.

    Eu observei que ao selecionar uma aba e pressionar Tab o foco ia automaticamente para o primeiro campo, com esse conhecimento passei a definir o foco no TabControl, logo em seguida o sistema envia um Tab sozinho e o foco vai para o primeiro campo da nossa próxima aba conforme desejado.

     

    Abraços.

    Sunday, August 08, 2010 8:17 PM

All replies

  • Inplemente a exibição da aba no evento Enter do primeiro controle da aba. Ou seja, quando o primeiro controle da aba receber o foco, a aba será exibida. Descarte o a implementação que você criou no evento KeyPress.

    private void textBox1_Enter(object sender, EventArgs e)
    {
        tabAdicionais.SelectedTab = tbpValores;
    }

    Faça isso para cada primeiro controle de cada aba, e se quiser fazer isso para cada último controle da cada aba.

    Boa sorte

    Thursday, July 06, 2006 1:34 PM
  •  Denis Silva wrote:

    Inplemente a exibição da aba no evento Enter do primeiro controle da aba. Ou seja, quando o primeiro controle da aba receber o foco, a aba será exibida. Descarte o a implementação que você criou no evento KeyPress.

    private void textBox1_Enter(object sender, EventArgs e)
    {
    tabAdicionais.SelectedTab = tbpValores;
    }

    Faça isso para cada primeiro controle de cada aba, e se quiser fazer isso para cada último controle da cada aba.

    Boa sorte



    Não funcionou, qdo ele sai do último controle da primeira aba já sai fora do TabControl e não vai pro próximo TextBox que ta na outra ABa :(
    Thursday, July 06, 2006 1:57 PM
  • Esse exemplo eu usava em VB6, mas não sei se funciona em .NET

    Outra coisa, o TabOrder do form está ok?

    Friday, July 07, 2006 3:31 AM
  •  Denis Silva wrote:

    Esse exemplo eu usava em VB6, mas não sei se funciona em .NET

    Outra coisa, o TabOrder do form está ok?



    Sim, ta tudo certinho, mas não vai :(
    Friday, July 07, 2006 10:44 AM
  • Fábio,

    A utilização dos eventos KeyUp e KeyDown para este cenário realmente não funcionam como esperado. A solução para este problema é o evento Leave do controle TextBox. Este evento ocorre sempre que o controle perde o foco, no caso do controle TextBox isso ocorrerá sempre que o usuário pressionar a tecla TAB. Este evento não interfere na ordem de tabulação e o primeiro controle da próxima tabPage receberá o foco. Faça o teste:

    private void textBox2_Leave(object sender, EventArgs e)

    {

       this.tabControl1.SelectedTab = this.tabPage2;

    }

    Acredito que isso solucionará seu problema.

     

    Friday, July 07, 2006 12:04 PM
  • Olá,

    A primeira vez que tentei fazer isso eu utilizei o leave, ele funciona mas tem outro problema, quando o usuário clica com o mouse e o foco estava naquele campo ele joga o foco pra tab e não pra onde o usuário clicou... resolvi o problema de outra maneira...

    Como ele sempre focava o segundo controle.. eu adicionei um groupbox dentro de cada aba e coloquei todos os controles dentro do group box, ficou feio mas funciona, pois agora o groupbox eh o primeiro elemento, ele pula o groupbox e foca o primeiro controle dentro dele..

    De qualquer forma obrigado pela ajuda,

    -Fábio.
    Friday, July 07, 2006 12:10 PM
  • Estava com o mesmo problema aqui, mas após passar um bom tempo quebrando a cabeça eu observei que este problema pode ser resolvido da seguinte forma:

            private void txtTelefone_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)

    {

                if (e.KeyCode == Keys.Tab || e.KeyCode == Keys.Enter)

                {

                    this.tabAbas.SelectedTab = this.tabAdministrativo;

                    this.tabAbas.Focus();

                }

            }

     

    No caso eu coloquei também o Keys.Enter porque faço o tratamento no KeyDown para que o Enter funcione como Tab.

    Eu observei que ao selecionar uma aba e pressionar Tab o foco ia automaticamente para o primeiro campo, com esse conhecimento passei a definir o foco no TabControl, logo em seguida o sistema envia um Tab sozinho e o foco vai para o primeiro campo da nossa próxima aba conforme desejado.

     

    Abraços.

    Sunday, August 08, 2010 8:17 PM