none
mudar de textbox automaticamente

    Question

  • 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!
    Thursday, May 26, 2011 7:36 PM

Answers

  • 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

    http://juliocosmo.wordpress.com

    Thursday, May 26, 2011 8:00 PM
  • 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!

    Friday, May 27, 2011 7:37 PM

All replies

  • 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

    http://juliocosmo.wordpress.com

    Thursday, May 26, 2011 8:00 PM
  • 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!

    Friday, May 27, 2011 7:37 PM