Usuário com melhor resposta
C# trabalhando com elementos gerados dinâmicamente

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?
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
-
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
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.
-
-
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
-
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.
-
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
-