Usuário com melhor resposta
mudar de textbox automaticamente

Pergunta
-
Boa tarde galera,tenho um formulario onde preciso preencher os numeros de codigo de barra, separado em 11 campos de 4 digitos cada. Ou seja, tenho 11 textbox com limite de 4 numeros.Gostaria de efetuar o preenchimento deles igual quando se coloca um serial no programa. Quando o usuario digitar o quarto digito de um campo, ele passa para o proximo automaticamente, ou se ele colar o codigo completo no primeiro campo, ja preenche os outros, ou se ele der um backspace, ele vai apagando e retornando para os anteriores automaticamente..sacaram a ideia?alguem ai tem alguma ideia de como fazer isso??valeu pela atenção!abrÇ a todos!
Respostas
-
Como vai Janngabriel,
segue um exemplo abaixo, adapte a sua necessidade. Neste exemplo estou utilizando com 4 textboxes, basta adicionar o restante depois, lembre-se de adicionar tambem a variavel recursive, para impedir a execução do código na atualização do textbox quando o serial for inserido por completo.
private bool recursive = false; private void TextBoxManager_TextChanged(object sender, EventArgs e) { if (!recursive) { string sName = ((TextBox)sender).Name; int iCount = ((TextBox)sender).Text.Length; if (iCount >= 4) { char[] values = ((TextBox)sender).Text.ToCharArray(); List<string> objValues = new List<string>(); string temp = string.Empty; if (iCount > 4) { for (int i = 0; i < values.Length; i++) { temp += values[i]; if (i == 3) { recursive = true; textBox1.Text = temp; temp = string.Empty; } else if (i == 7) { recursive = true; textBox2.Text = temp; temp = string.Empty; } else if (i == 11) { recursive = true; textBox3.Text = temp; temp = string.Empty; } else if (i == 15) { recursive = true; textBox4.Text = temp; temp = string.Empty; } } } else { switch (sName) { case "textBox1": textBox2.Focus(); break; case "textBox2": textBox3.Focus(); break; case "textBox3": textBox4.Focus(); break; } } } } }
Se a resposta foi útil pra você, colabore com o fórum marcando como resposta esta sugestão, obrigado!
Júlio Cesar Cosmo, MCP, MCTS - Influenciador Sharepoint, Influenciadores Microsoft
- Sugerido como Resposta Luiz Estevam sexta-feira, 27 de maio de 2011 00:36
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 27 de maio de 2011 21:19
-
Cara, agradeço muito a sua ajuda.
Porem seu codigo contem alguns bugs. Por exemplo, nao funciona o retorno e caso eu digite, apague e digite novamente, da erro.
Mas graças a ele eu consegui fazer outro.
montei de forma generica para que todos possam usar.
segue abaixo a classe que criei :D
namespace textGroup { public class Controle { private List<TextBox> txt; public List<TextBox> Txt { get { return txt; } set { txt = value; } } private int qtdChar; public int QtdChar { get { return qtdChar; } set { qtdChar = value; } } /// <summary> /// Construtor da classe /// </summary> /// <param name="lista">Lista de Textbox que estam no grupo</param> /// <param name="n">Numero maximo de caracteres por textbox</param> public Controle(List<TextBox> lista, int n) { txt = lista; qtdChar = n; } /// <summary> /// Metodo que escreve nos textbox. Este metodo deve ser chamano no textchange de cada textbox /// </summary> /// <param name="sender">Parametro object</param> /// <param name="e">Parametro EventArgs</param> public void escreve(object sender, EventArgs e) { string nomeObj = ((TextBox)sender).Name; int n = ((TextBox)sender).Text.Length; if (n >= qtdChar) { char[] valores = ((TextBox)sender).Text.ToCharArray(); string temp = string.Empty; if (n > qtdChar) { int vlTxt = qtdChar-1; int txtAtual = 0; for (int i = 0; i < valores.Length; i++) { temp += valores[i]; if (i == vlTxt) { txt[txtAtual].Text = temp; temp = string.Empty; vlTxt += 4; txtAtual++; } } } else { focaliza(nomeObj,1); } } } /// <summary> /// Metodo que apaga os textos e retorna pro textbox anterior Este metodo deve ser chamado no evento KEYPRESS do textbox /// </summary> /// <param name="sender">Parametro object</param> /// <param name="e">Parametro KeyPressEventArgs</param> public void apaga(object sender, KeyPressEventArgs e) { string nomeObj = ((TextBox)sender).Name; int n = ((TextBox)sender).Text.Length; if (e.KeyChar == (char)8) { if (n == 1 || n==0) focaliza(nomeObj, 0); } } /// <summary> /// Metodo que muda o foco para o proximo textbox ou o anterior /// </summary> /// <param name="nomeObj">Nome do objecto textbox</param> /// <param name="direcao">1 para proximo, 0 para anterior</param> private void focaliza(string nomeObj,int direcao) { for (int i = 0; i < txt.Count; i++) { if (txt[i].Name == nomeObj) { if (direcao == 1) { if ((i + 1) != txt.Count) txt[i + 1].Focus(); } else { if ((i - 1) != -1) txt[i - 1].Focus(); } } } } } }
grande abraço a todos!
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 27 de maio de 2011 21:19
Todas as Respostas
-
Como vai Janngabriel,
segue um exemplo abaixo, adapte a sua necessidade. Neste exemplo estou utilizando com 4 textboxes, basta adicionar o restante depois, lembre-se de adicionar tambem a variavel recursive, para impedir a execução do código na atualização do textbox quando o serial for inserido por completo.
private bool recursive = false; private void TextBoxManager_TextChanged(object sender, EventArgs e) { if (!recursive) { string sName = ((TextBox)sender).Name; int iCount = ((TextBox)sender).Text.Length; if (iCount >= 4) { char[] values = ((TextBox)sender).Text.ToCharArray(); List<string> objValues = new List<string>(); string temp = string.Empty; if (iCount > 4) { for (int i = 0; i < values.Length; i++) { temp += values[i]; if (i == 3) { recursive = true; textBox1.Text = temp; temp = string.Empty; } else if (i == 7) { recursive = true; textBox2.Text = temp; temp = string.Empty; } else if (i == 11) { recursive = true; textBox3.Text = temp; temp = string.Empty; } else if (i == 15) { recursive = true; textBox4.Text = temp; temp = string.Empty; } } } else { switch (sName) { case "textBox1": textBox2.Focus(); break; case "textBox2": textBox3.Focus(); break; case "textBox3": textBox4.Focus(); break; } } } } }
Se a resposta foi útil pra você, colabore com o fórum marcando como resposta esta sugestão, obrigado!
Júlio Cesar Cosmo, MCP, MCTS - Influenciador Sharepoint, Influenciadores Microsoft
- Sugerido como Resposta Luiz Estevam sexta-feira, 27 de maio de 2011 00:36
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 27 de maio de 2011 21:19
-
Cara, agradeço muito a sua ajuda.
Porem seu codigo contem alguns bugs. Por exemplo, nao funciona o retorno e caso eu digite, apague e digite novamente, da erro.
Mas graças a ele eu consegui fazer outro.
montei de forma generica para que todos possam usar.
segue abaixo a classe que criei :D
namespace textGroup { public class Controle { private List<TextBox> txt; public List<TextBox> Txt { get { return txt; } set { txt = value; } } private int qtdChar; public int QtdChar { get { return qtdChar; } set { qtdChar = value; } } /// <summary> /// Construtor da classe /// </summary> /// <param name="lista">Lista de Textbox que estam no grupo</param> /// <param name="n">Numero maximo de caracteres por textbox</param> public Controle(List<TextBox> lista, int n) { txt = lista; qtdChar = n; } /// <summary> /// Metodo que escreve nos textbox. Este metodo deve ser chamano no textchange de cada textbox /// </summary> /// <param name="sender">Parametro object</param> /// <param name="e">Parametro EventArgs</param> public void escreve(object sender, EventArgs e) { string nomeObj = ((TextBox)sender).Name; int n = ((TextBox)sender).Text.Length; if (n >= qtdChar) { char[] valores = ((TextBox)sender).Text.ToCharArray(); string temp = string.Empty; if (n > qtdChar) { int vlTxt = qtdChar-1; int txtAtual = 0; for (int i = 0; i < valores.Length; i++) { temp += valores[i]; if (i == vlTxt) { txt[txtAtual].Text = temp; temp = string.Empty; vlTxt += 4; txtAtual++; } } } else { focaliza(nomeObj,1); } } } /// <summary> /// Metodo que apaga os textos e retorna pro textbox anterior Este metodo deve ser chamado no evento KEYPRESS do textbox /// </summary> /// <param name="sender">Parametro object</param> /// <param name="e">Parametro KeyPressEventArgs</param> public void apaga(object sender, KeyPressEventArgs e) { string nomeObj = ((TextBox)sender).Name; int n = ((TextBox)sender).Text.Length; if (e.KeyChar == (char)8) { if (n == 1 || n==0) focaliza(nomeObj, 0); } } /// <summary> /// Metodo que muda o foco para o proximo textbox ou o anterior /// </summary> /// <param name="nomeObj">Nome do objecto textbox</param> /// <param name="direcao">1 para proximo, 0 para anterior</param> private void focaliza(string nomeObj,int direcao) { for (int i = 0; i < txt.Count; i++) { if (txt[i].Name == nomeObj) { if (direcao == 1) { if ((i + 1) != txt.Count) txt[i + 1].Focus(); } else { if ((i - 1) != -1) txt[i - 1].Focus(); } } } } } }
grande abraço a todos!
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 27 de maio de 2011 21:19