none
Programa não obedece a lógica do código RRS feed

  • Pergunta

  • Olá amigos.

    Tenho um código onde informo um item digitando o código do produto e a quantidade que será adicionado em um grid quando clico um botão que chamo de adicionar.


    Até tudo bem.

    Mas pensei em não precisar clicar no botão. Depois de digitar a quantidade quando teclar Tab ou Enter ser adicionado ao grid e retornar ao campo do código para ser digitado um outro item.

    O problema é que quando teclo Tab ou Enter dá uma mensagem de erro, mas se tiro o comando para retornar ao campo alimenta o grid corretamente porém o foco vai para outro campo.

    Segue o código:

         public void AdiconarItem()
            {
                try
                {
                    dgvItens.Rows.Add(txtCodigoMat.Text, txtDescricaoMat.Text, txtQuantidadeMat.Text);
     
                    txtCodigoMat.Focus();
     
                }
                catch (Exception)
                {
                    throw;
                }
            }

    Obrigado.

    sábado, 25 de junho de 2016 23:50

Respostas

  • Sim procede.. Seu evento leave chama AdiconarItem, que por sua vez muda o foco para txtCodigoMat.

    Se um evento leave ocorre é porque outro controle ganhou foco. A linha de eventos fica estranha, veja:

    A ordem de eventos disparado quando voce sai de um campo é essa:

    -Enter 
    -GotFocus 
    -LostFocus 
    -Leave 
    -Validating 
    -Validated



    O problema é que o metodo FOCUS chamado no evento LEAVE força um novo LOSTFOCUS (que ocorre antes do LEAVE)


    Ou seja chamada recursiva. 

    Para evitar isso, voce teria que usar uma variavel extena para saber se é a primeira vez que voce passa pelo leave e nao re-executar no caso de uma segunda vez (o codigo é só um exemplo e voce vai ter que adapta-lo às suas necessidades)

    private bool m_induced = false;
    
    
    private void txtBox_Leave(object sender, System.EventArgs e)
       {
         try
             {
                 //check for textbox value;
              }
         catch
              {
                 MessageBox.Show("Date must be a valid Date Time Format: XX/XX/XXXX");
                 if (!induced && !txtBox.Focused)
                    {
    induced = true;
                      txtBox.Focus();
                     }
              }
         }

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 29 de junho de 2016 13:48
    Moderador

Todas as Respostas

  • Boa noite,

    Poste o erro para que possamos te ajuda!

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    domingo, 26 de junho de 2016 01:42
  • Olá Silvaney.

    Desculpa, esqueci de colocar o erro, segue :

    An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll

    Obrigado.

    domingo, 26 de junho de 2016 20:07
  • Este erro ocorre quando voce tem uma funcao iterativa (que chama ela mesma) sem um criterio de fim.

    Analizando seu codigo, a unica coisa que pode estar ocoasionando isso é que o metodo AdiconarItem esteja sendo chamado quando o campo txtCodigoMat ganhe o foco.

    A logica é a seguinte... voce invoca AdiconarItem e este tenta focar no campo txtCodigoMat, que chama AdiconarItem e volta a focar no campo txtCodigoMat até que o erro ocorra. É por isso que quando voce remove a instruçao txtCodigoMat.Focus() o codigo volta a funcinar sem erros...


    Nao seria isso? Verifique.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------


    segunda-feira, 27 de junho de 2016 14:35
    Moderador
  • Olá Willian.

    Caramba, difícil né ?.

    Entendi o que explicou mas não consigo exergar o problema.

    Vou postar os métodos para você verificar, porfavor.

            

    privatevoid txtQuantidadeMat_Leave(object sender, EventArgs e)         {             // Se não preencher o campo mantém o foco neleif (txtQuantidadeMat.Text == "" || txtQuantidadeMat.Text == "0")             {                 txtQuantidadeMat.Focus();             }             // Com esta rotina estou tentando incluir o item no grid sem precisar clicar em adicionar (+).// Quando teclar Tab ou Enter adicona o item             AdiconarItem();         }         publicvoid AdiconarItem()         {             try             {                 dgvItens.Rows.Add(txtCodigoMat.Text, txtDescricaoMat.Text, txtQuantidadeMat.Text);                 txtCodigoMat.Text = "";                 txtDescricaoMat.Text = "";                 txtQuantidadeMat.Text = "";                 txtEstoqueAtualMat.Text = "";                 txtCodigoMat.Focus();                 //objite = null;             }             catch (Exception)             {                 throw;             }         }

    Procede sua suspeita ?.

    Obrigado.

                                

    quarta-feira, 29 de junho de 2016 01:49
  • Sim procede.. Seu evento leave chama AdiconarItem, que por sua vez muda o foco para txtCodigoMat.

    Se um evento leave ocorre é porque outro controle ganhou foco. A linha de eventos fica estranha, veja:

    A ordem de eventos disparado quando voce sai de um campo é essa:

    -Enter 
    -GotFocus 
    -LostFocus 
    -Leave 
    -Validating 
    -Validated



    O problema é que o metodo FOCUS chamado no evento LEAVE força um novo LOSTFOCUS (que ocorre antes do LEAVE)


    Ou seja chamada recursiva. 

    Para evitar isso, voce teria que usar uma variavel extena para saber se é a primeira vez que voce passa pelo leave e nao re-executar no caso de uma segunda vez (o codigo é só um exemplo e voce vai ter que adapta-lo às suas necessidades)

    private bool m_induced = false;
    
    
    private void txtBox_Leave(object sender, System.EventArgs e)
       {
         try
             {
                 //check for textbox value;
              }
         catch
              {
                 MessageBox.Show("Date must be a valid Date Time Format: XX/XX/XXXX");
                 if (!induced && !txtBox.Focused)
                    {
    induced = true;
                      txtBox.Focus();
                     }
              }
         }

    att



    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quarta-feira, 29 de junho de 2016 13:48
    Moderador
  • Olá Willian.

    Tentei adaptar sua sugestão mas não consegui.

    Meu domínio sobre o C# ainda é pouco. Me perco.

    Haveria alguma possibilidade de acessar meu projeto com acesso remoto e tentar me ajudar.

    Agradeceria muito.

    Estou tentando levar um projeto que já está montado adiante, mas este tipo de situação me deixa muito frustado.

    Sei que só tempo e muita prática melhorará minha produtividade.

    Se puder me ajudar, agradeço muito.

    Obrigado.

    quinta-feira, 30 de junho de 2016 02:23
  • Poste seu codigo em algum lugar (one drive, dropbox, google drive) e me envie o link por email:

    wjat.joi [at] gmail . com

    Se eu tiver tempo esse fim de semana, eu dou uma olhada.

    Att


    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    quinta-feira, 30 de junho de 2016 13:03
    Moderador
  • Valeu, obrigado.
    quinta-feira, 30 de junho de 2016 13:21