none
Problema com Controle MaskedTextBox (somente números) RRS feed

  • Pergunta

  • Estou criando um componete para servir para todo o sistema, logo estou fazendo um user control MaskedTextBox. Estou criando todos os métodos para ele, mas estou encontrando uma certa dificuldade em permitir apenas apenas números, segue os eventos que já criei.

    Obs: Este controle tem o seguinte comportamento, quando o usuário clicar,eu removo toda a formatação (igual no excel), e quando ele sai eu formato novamente, mas mesmo sem a mascara tenho que continuar a validar e permitir inserir o que foi definido via configuração.

        private void InitializeComponent()
        {
          //Quando sai do controle
          this.Leave += new System.EventHandler(this.OnLeave);
    
          //Quando Clica no controle
          this.Click += new System.EventHandler(this.OnClick);
    
          //Quando digita no controle
          this.KeyPress += this.OnKeyPress;
    
          //Quando sai do controle
          this.LostFocus += new EventHandler(MaskedTextBox1_LostFocus);
        }
    
        void MaskedTextBox1_LostFocus(object sender, EventArgs e)
        {
          this.Mask = "";
        }
    
     public void ConfigMascaraParaTipoDados()
        {
          switch (TipoDados)
          {
            case TipoDados.Default:
              this.Mask = "#######-##";
              break;
            case TipoDados.Quantidade:
              this.Mask = "#(###)#";
              break;
            case TipoDados.Moeda:
              this.Mask = "###.####.##";
              break;
            case TipoDados.Variacao:
              this.Mask = "(####)#######-##";
              break;
            case TipoDados.Customizado:
              break;
          }
        }
    
      void MaskedTextBox1_LostFocus(object sender, EventArgs e)
        {
          this.Mask = "";
        }
    
    		private void OnLeave(object sender, EventArgs e)
    		{
          ConfigMascaraParaTipoDados();
    		}
    
        public void OnClick(object sender, EventArgs e)
        {
          this.Mask = "";
        }
    
    public void OnKeyPress(object sender, KeyPressEventArgs e)
        {
          //Verificando se é um número
          if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
          {
            int total = 50;
            switch (TipoDados)
            {
              case TipoDados.Default:
                //this.Mask = "#######-##";
                total = 8;
                break;
              case TipoDados.Quantidade:
                //this.Mask = "#(###)#";
                total = 4;
                break;
              case TipoDados.Moeda:
                //this.Mask = "###.####.##";
                total = 7;
                break;
              case TipoDados.Variacao:
                //this.Mask = "(####)#######-##";
                total = 12;
                break;
              case TipoDados.Customizado:
                break;
            }
    
            if (this.Text.Length > total)
              e.Handled = true;
    
            if (this.SelectedText.Length <= 0 && this.Text.Length > total)
              e.Handled = true;
            else
              e.Handled = false;
          }
        }

    Benjamim JR.
    terça-feira, 1 de junho de 2010 23:32

Respostas

  • Se queres apenas numeros põe assim no OnKeyPress

     

     //Verificando se é um número
          if (Char.IsDigit(e.KeyChar) || e.KeyChar == Convert.ToChar(8))
          {
            int total = 50;
            switch (TipoDados)
            {
              case TipoDados.Default:
                //this.Mask = "#######-##";
                total = 8;
                break;
              case TipoDados.Quantidade:
                //this.Mask = "#(###)#";
                total = 4;
                break;
              case TipoDados.Moeda:
                //this.Mask = "###.####.##";
                total = 7;
                break;
              case TipoDados.Variacao:
                //this.Mask = "(####)#######-##";
                total = 12;
                break;
              case TipoDados.Customizado:
                break;
            }
    
            if (this.Text.Length > total)
              e.Handled = true;
    
            if (this.SelectedText.Length <= 0 && this.Text.Length > total)
              e.Handled = true;
            else
              e.Handled = false;
    
          }
          else
          {
            e.Handled = true;
          }


    msn: poseidonfba@hotmail.com
    terça-feira, 1 de junho de 2010 23:53
  • Ai você pode fazer no evento TextChanged

    msn: poseidonfba@hotmail.com
    quarta-feira, 2 de junho de 2010 00:50

Todas as Respostas

  • Se queres apenas numeros põe assim no OnKeyPress

     

     //Verificando se é um número
          if (Char.IsDigit(e.KeyChar) || e.KeyChar == Convert.ToChar(8))
          {
            int total = 50;
            switch (TipoDados)
            {
              case TipoDados.Default:
                //this.Mask = "#######-##";
                total = 8;
                break;
              case TipoDados.Quantidade:
                //this.Mask = "#(###)#";
                total = 4;
                break;
              case TipoDados.Moeda:
                //this.Mask = "###.####.##";
                total = 7;
                break;
              case TipoDados.Variacao:
                //this.Mask = "(####)#######-##";
                total = 12;
                break;
              case TipoDados.Customizado:
                break;
            }
    
            if (this.Text.Length > total)
              e.Handled = true;
    
            if (this.SelectedText.Length <= 0 && this.Text.Length > total)
              e.Handled = true;
            else
              e.Handled = false;
    
          }
          else
          {
            e.Handled = true;
          }


    msn: poseidonfba@hotmail.com
    terça-feira, 1 de junho de 2010 23:53
  • Como eu faço para pegar o evento de quando o cara set o focu no controle (tipo navegando clicando no tab) ?
    Benjamim JR.
    quarta-feira, 2 de junho de 2010 00:20
  • você fala quando o controle recebe o focu??

    msn: poseidonfba@hotmail.com
    quarta-feira, 2 de junho de 2010 00:29
  • Sim, pq neste momento tenho que remover a formatação
    Benjamim JR.
    quarta-feira, 2 de junho de 2010 00:39
  • É o evento Enter
    msn: poseidonfba@hotmail.com
    quarta-feira, 2 de junho de 2010 00:42
  • e quando o cara da um copiar e colar...
    Benjamim JR.
    quarta-feira, 2 de junho de 2010 00:45
  • Ai você pode fazer no evento TextChanged

    msn: poseidonfba@hotmail.com
    quarta-feira, 2 de junho de 2010 00:50
  • Como eu faço para no TextChanged validar para que o cara só tenha números... e ainda ser do tamanho máximo do campo
    Benjamim JR.
    quarta-feira, 2 de junho de 2010 01:11
  • Olá Benjamim,

    você pode usar o isso no evento KeyPress do textbox.

    Ex.

    'método que recebe o objeto para a validação dos campos
    
    Private Sub Validar(ByVal dado As Object)
    
      If Char.IsLetter(dado.KeyChar.ToString) Then
    
       dado.handled = True
    
      End If
    
    End Sub
    
    
    
    'no evento KeyPress, será enviando para o método o evento para verificar se é letra, caso vdd retorna handled = true
    
    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) _
    
     Handles TextBox1.KeyPress
    
      Validar(e)
    
     End Sub
    
    

    Neste caso o método está validando somente números, caso queira usar para validar somente letras, troque no método o Char.IsLetter para Char.IsNumber.

    O tamanho máximo você pode usar o textbox1.text.lenght = 14, só aceita até 14. Ou na propriedado do textbox1, altere o MaxLenght para um tamanho específico.

    Espero ter ajudado.


    quarta-feira, 23 de março de 2011 18:34