none
C# trabalhando com elementos gerados dinâmicamente RRS feed

  • Pergunta

  • Olá, estou desenvolvendo um software e travei na parte indicada por =>:

                                    

    private void Camadas()
            {
                int tbidx = tcSPT.SelectedIndex + 1;
                int NC = Convert.ToInt32(tbNCamadasSPT1.Text);
                int ph = 0;            

                for (int i = 1; i <= NC; i++)
                {
                    Panel pmtbC = new Panel();
                    MaskedTextBox mtbC = new MaskedTextBox();

                    tlpCTSSPT1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));  

                    pmtbC.Dock = DockStyle.Fill;
                    ph = pmtbC.Height;

                    tlpCTSSPT1.Controls.Add(pmtbC, 0, i - 1);

                    mtbC.Name = "mtbC" + i.ToString() + "SPT" + tbidx.ToString();
                    mtbC.Mask = "00,00";
                    mtbC.Size = new Size(34, 20);
                    mtbC.Location = new Point((pmtbC.Width / 2) - 17, (ph / NC) - 5);
                    pmtbC.Controls.Add(mtbC);

                    mtbC.KeyUp += new KeyEventHandler(mtbC_KeyUp);

                    void mtbC_KeyUp(object sender, KeyEventArgs e)
                    {
                        if(e.KeyData == Keys.Oemcomma || e.KeyData == Keys.OemPeriod || e.KeyData == Keys.Decimal)
                        {
                            mtbC.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                            if(mtbC.Text.Length <= 2) { mtbC.Text = mtbC.Text.Trim().PadLeft(2, '0'); }
                            mtbC.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
                        }
     ====>>>   if(mtbC.MaskCompleted == true) { mtbC.Focus(); }
                    }
                }

    }

    O trecho do código gera N maskedtextbox conforme a necessidade do usuário. Estou tentando fazer com que, sempre que uma maskedtextbox seja completada o foco avance para a seguinte maskedtextbox, mas não sei como referenciar isso. Alguma sugestão?

    segunda-feira, 22 de janeiro de 2018 17:31

Respostas

  • Você criou o evento mtbC_KeyUp dentro do método Camadas()? Isto está estranho.

    Pegue o maior TabIndex do seu formulário fixo (campos criados em design time) daí em cada loop para criação de campo dinâmico você altera o TabIndex deste novo campo para o maior TabIndex + a variável do loop, exemplo (supondo que você tenha 10 campos fixos no form):

    private void Camadas()
            {
                int tbidx = tcSPT.SelectedIndex + 1;
                int NC = Convert.ToInt32(tbNCamadasSPT1.Text);
                int ph = 0;            
    
                for (int i = 1; i <= NC; i++)
                {
                    Panel pmtbC = new Panel();
                    MaskedTextBox mtbC = new MaskedTextBox();
    
                    tlpCTSSPT1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));  
    
                    pmtbC.Dock = DockStyle.Fill;
                    ph = pmtbC.Height;
    
                    tlpCTSSPT1.Controls.Add(pmtbC, 0, i - 1);
    
                    mtbC.Name = "mtbC" + i.ToString() + "SPT" + tbidx.ToString();
                    mtbC.TabIndex = 10 + i; // <= AQUI VC coloca o maior índice de TabIndex somando com o contador do loop
    
                    mtbC.Mask = "00,00";
                    mtbC.Size = new Size(34, 20);
                    mtbC.Location = new Point((pmtbC.Width / 2) - 17, (ph / NC) - 5);
                    pmtbC.Controls.Add(mtbC);
    
                    mtbC.KeyUp += new KeyEventHandler(mtbC_KeyUp);
    
                    
                }
    
    }
    
    
    void mtbC_KeyUp(object sender, KeyEventArgs e)
                    {
                        if(e.KeyData == Keys.Oemcomma || e.KeyData == Keys.OemPeriod || e.KeyData == Keys.Decimal)
                        {
                            mtbC.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                            if(mtbC.Text.Length <= 2) { mtbC.Text = mtbC.Text.Trim().PadLeft(2, '0'); }
                            mtbC.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
                        }
                        if(mtbC.MaskCompleted == true) { this.SelectNextControl(ActiveControl, true, true, true, true); }
                    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta Jonh Kalak segunda-feira, 22 de janeiro de 2018 19:25
    segunda-feira, 22 de janeiro de 2018 18:25
  • void mtbC_KeyUp(object sender, KeyEventArgs e)
                    {
                        var mtbC = (MaskedTextBox)sender;
    
                        if(e.KeyData == Keys.Oemcomma || e.KeyData == Keys.OemPeriod || e.KeyData == Keys.Decimal)
                        {
                            mtbC.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                            if(mtbC.Text.Length <= 2) { mtbC.Text = mtbC.Text.Trim().PadLeft(2, '0'); }
                            mtbC.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
                        }
                        if(mtbC.MaskCompleted == true) { this.SelectNextControl(ActiveControl, true, true, true, true); }
                    }
    Tente desta forma.

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta Jonh Kalak segunda-feira, 22 de janeiro de 2018 19:24
    segunda-feira, 22 de janeiro de 2018 18:51

Todas as Respostas

  • Está acontecendo algum erro? Nos dê mais detalhes.

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    segunda-feira, 22 de janeiro de 2018 18:02
  • Quando um maskedtextbox for completado ele deveria dar o foco para o seguinte, mas como eles foram criados dinâmicamente não sei como referenciar o seguinte maskedtextbox. Já tentei usar com um laço for e mtbC[i].Focus(); mas dá erro.
    segunda-feira, 22 de janeiro de 2018 18:09
  • Você criou o evento mtbC_KeyUp dentro do método Camadas()? Isto está estranho.

    Pegue o maior TabIndex do seu formulário fixo (campos criados em design time) daí em cada loop para criação de campo dinâmico você altera o TabIndex deste novo campo para o maior TabIndex + a variável do loop, exemplo (supondo que você tenha 10 campos fixos no form):

    private void Camadas()
            {
                int tbidx = tcSPT.SelectedIndex + 1;
                int NC = Convert.ToInt32(tbNCamadasSPT1.Text);
                int ph = 0;            
    
                for (int i = 1; i <= NC; i++)
                {
                    Panel pmtbC = new Panel();
                    MaskedTextBox mtbC = new MaskedTextBox();
    
                    tlpCTSSPT1.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));  
    
                    pmtbC.Dock = DockStyle.Fill;
                    ph = pmtbC.Height;
    
                    tlpCTSSPT1.Controls.Add(pmtbC, 0, i - 1);
    
                    mtbC.Name = "mtbC" + i.ToString() + "SPT" + tbidx.ToString();
                    mtbC.TabIndex = 10 + i; // <= AQUI VC coloca o maior índice de TabIndex somando com o contador do loop
    
                    mtbC.Mask = "00,00";
                    mtbC.Size = new Size(34, 20);
                    mtbC.Location = new Point((pmtbC.Width / 2) - 17, (ph / NC) - 5);
                    pmtbC.Controls.Add(mtbC);
    
                    mtbC.KeyUp += new KeyEventHandler(mtbC_KeyUp);
    
                    
                }
    
    }
    
    
    void mtbC_KeyUp(object sender, KeyEventArgs e)
                    {
                        if(e.KeyData == Keys.Oemcomma || e.KeyData == Keys.OemPeriod || e.KeyData == Keys.Decimal)
                        {
                            mtbC.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                            if(mtbC.Text.Length <= 2) { mtbC.Text = mtbC.Text.Trim().PadLeft(2, '0'); }
                            mtbC.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
                        }
                        if(mtbC.MaskCompleted == true) { this.SelectNextControl(ActiveControl, true, true, true, true); }
                    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta Jonh Kalak segunda-feira, 22 de janeiro de 2018 19:25
    segunda-feira, 22 de janeiro de 2018 18:25
  • A sua solução funcionou!

    Não posso colocar o evento KeyUp fora do Camadas() porque passa a dar erro em mtbC dentro do evento KeyUp.

    Erro: "O nome mtbC não existe no contexto atual".

    Gostaria que estivesse fora, mas não sei como corrigir isso.

    Obrigado pela ajuda.

    segunda-feira, 22 de janeiro de 2018 18:41
  • void mtbC_KeyUp(object sender, KeyEventArgs e)
                    {
                        var mtbC = (MaskedTextBox)sender;
    
                        if(e.KeyData == Keys.Oemcomma || e.KeyData == Keys.OemPeriod || e.KeyData == Keys.Decimal)
                        {
                            mtbC.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
                            if(mtbC.Text.Length <= 2) { mtbC.Text = mtbC.Text.Trim().PadLeft(2, '0'); }
                            mtbC.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
                        }
                        if(mtbC.MaskCompleted == true) { this.SelectNextControl(ActiveControl, true, true, true, true); }
                    }
    Tente desta forma.

    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta Jonh Kalak segunda-feira, 22 de janeiro de 2018 19:24
    segunda-feira, 22 de janeiro de 2018 18:51
  • Deu Certo.

    Mais uma vez, obrigado pela ajuda.


    segunda-feira, 22 de janeiro de 2018 19:01