Componente em C# – TextBox com validação de CPF, CNPJ e mascara dinâmica

Seguindo a linha do ultimo post, mais um componente.
Um componente do tipo TextBox, com validação de CPF e CNPJ e com mascara dinâmica,

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

//Criado do Wagner Braz Rodrigues
//Data 23/09/2010
//Ao utilizar este componente 
//por favor, referencie o criador

namespace Componentes
{
    class TextBoxCpfCnpj : TextBox 
    {
        private String tipo;

        //Property Tipo onde o programador vai definir o tipo cnpj ou cpf
        public String Tipo
        {
            get { return tipo; }
            set
            {
                try
                {
                    tipo = value;

                    //Verifica qual o tipo para atribuir
                    //o tamanho maximo da string
                    if (tipo.ToUpper() == "CPF")
                    {
                        MaxLength = 14;
                    }
                    else if (tipo.ToUpper() == "CNPJ")
                    {
                        MaxLength = 18;
                    }
                }
                catch
                {
                    //Exception criada para caso o objeto esteja sem tipo
                    throw new Exception("TextBoxCpfCnpj: Entre com o Tipo, CNPJ ou CPF");
                }

            }
        }

        //Sobescreve o metodo OnLeave
        //Verifica qual o tipo CNPJ ou CPF
        //e chama a validação, caso retorne
        //falso retorna o foco ao objeto 
        //e emite um beep
        protected override void OnLeave(EventArgs e)
        {
            base.OnLeave(e);

            if (tipo.ToUpper() == "CPF")
            {
                if (!ValidaCPF(Text))
                {
                    System.Console.Beep(100,100);
                    this.Focus();
                }
            }

            if (tipo.ToUpper() == "CNPJ")
            {
                if (!ValidaCnpj(Text))
                {
                    System.Console.Beep(100,100);
                    this.Focus();
                }
            }
        }

        //Metodo que cria a mascara dinamica para CPF
        private void AjustaMascaraCPF()
        {
            int cont = 0;
            int cursorPos = SelectionStart;

            foreach (Char c in Text)
            {
                if (((cont == 3) || (cont == 7)) && (c != '.') && (Text.Length >= cont))
                {
                    Text = Text.Insert(cont,".");
                    SelectionStart = cursorPos + 1;
                }
                if ( (c == '.') && (Text.Length >= cont) && (cont != 3) && (cont != 7) )
                {
                    Text = Text.Remove(cont,1);
                    SelectionStart = cursorPos;
                }

                if ( (cont == 11) && (c != '-') && (Text.Length >= cont))
                {
                    Text = Text.Insert(11, "-");
                    SelectionStart = cursorPos + 1;
                }
                if ((c == '-') && (cont != 11) && (Text.Length >= cont))
                {
                    Text = Text.Remove(cont,1);
                    SelectionStart = cursorPos;
                }

                    cont++;
            }
        }

        //Metodo que cria a mascara dinamica para CNPJ
        private void AjustaMascaraCnpj()
        {
            int cont = 0;
            int cursorPos = SelectionStart;

            foreach (Char c in Text)
            {
                if (((cont == 2) || (cont == 6)) && (c != '.') && (Text.Length >= cont))
                {
                    Text = Text.Insert(cont, ".");
                    SelectionStart = cursorPos + 1;
                }
                if ((c == '.') && (Text.Length >= cont) && (cont != 2) && (cont != 6))
                {
                    Text = Text.Remove(cont, 1);
                    SelectionStart = cursorPos;
                }

                if ((cont == 10) && (c != '\\') && (Text.Length >= cont))
                {
                    Text = Text.Insert(10, @"\");
                    SelectionStart = cursorPos + 1;
                }
                if ((c == '\\') && (cont != 10) && (Text.Length >= cont))
                {
                    Text = Text.Remove(cont, 1);
                    SelectionStart = cursorPos;
                }
               
                if ((cont == 15) && (c != '-') && (Text.Length >= cont))
                {
                    Text = Text.Insert(15, "-");
                    SelectionStart = cursorPos + 1;
                }
                if ((c == '-') && (cont != 15) && (Text.Length >= cont))
                {
                    Text = Text.Remove(cont, 1);
                    SelectionStart = cursorPos;
                }

                cont++;
            }
        }


        //Sobescreve o metodo OnKeyUp
        //Verifica qual o tipo CPF ou CNPJ
        //e e chama o metodo para a mascara dinamica
        protected override void OnKeyUp(KeyEventArgs e)
        {
            base.OnKeyUp(e);

            if (tipo.ToUpper() == "CPF")
                AjustaMascaraCPF();
            else if (tipo.ToUpper() == "CNPJ")
                AjustaMascaraCnpj();
        }


        //Sobescreve o metodo onKeyPress, para evitar que 
        //o usuario entre com um valor não numerico
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            base.OnKeyPress(e);

            if ((!Char.IsDigit(e.KeyChar)) && (e.KeyChar != '\x0008'))
            {
                e.KeyChar = '\x0000';
            }          
        }

        //Sobrecarga de construtores
        //permitindo criar o objeto em tempo de execução
        //atribuindo o tipo
        public TextBoxCpfCnpj(String t){ Tipo = t;}
        public TextBoxCpfCnpj(){}
       
        //Valida CPF
        private  bool ValidaCPF(String cpf)
        {
            Boolean valida = true;
            int[] multiplicador1 = new int[9] { 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[10] { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2 };
            String tempCpf;
            String digito;
            String verifica;
            int soma;
            int resto;

            cpf = cpf.Trim();
            cpf = cpf.Replace("-","").Replace(".","");

            if (cpf.Length == 11)
            {
                verifica = cpf.Substring(9);
                tempCpf = cpf.Substring(0, 9);
                soma = 0;

                for (int i = 0; i < 9; i++)
                {
                    soma = soma + int.Parse(tempCpf[i].ToString()) * multiplicador1[i];
                }

                resto = soma % 11;

                resto = resto < 2 ? resto = 0 : resto = 11 - resto; ;

                digito = resto.ToString();

                tempCpf = tempCpf + digito;

                soma = 0;
                for (int i = 0; i < 10; i++)
                {
                    soma = soma + int.Parse(tempCpf[i].ToString()) * multiplicador2[i];
                }

                resto = soma % 11;

                resto = resto < 2 ? resto = 0 : resto = 11 - resto; ;

                digito = digito + resto.ToString();

                if (digito != verifica)
                {
                    valida = false;
                }
                switch (cpf)
                {
                    case "00000000000":
                        {
                            valida = false;
                            break;
                        }
                    case "11111111111":
                        {
                            valida = false;
                            break;
                        }
                    case "	22222222222	":
                        {
                            valida = false;
                            break;
                        }
                    case "33333333333":
                        {
                            valida = false;
                            break;
                        }
                    case "44444444444":
                        {
                            valida = false;
                            break;
                        }
                    case "55555555555":
                        {
                            valida = false;
                            break;
                        }
                    case "66666666666":
                        {
                            valida = false;
                            break;
                        }
                    case "77777777777":
                        {
                            valida = false;
                            break;
                        }
                    case "88888888888":
                        {
                            valida = false;
                            break;
                        }
                    case "99999999999":
                        {
                            valida = false;
                            break;
                        }
                }
            }
            else
            {
                valida = false;
            }
            return valida;
        }

        //Valida  CNPJ
        private  bool ValidaCnpj(String cnpj)
        {
            Boolean valida = true;
            int[] multiplicador1 = new int[12] { 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            int[] multiplicador2 = new int[13] { 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
            String tempCnpj;
            String digito;
            String verifica;
            int soma;
            int resto;

            cnpj = cnpj.Trim();
            cnpj = cnpj.Replace("/","").Replace(".","").Replace("-","");

            if (cnpj.Length == 14)
            {
                verifica = cnpj.Substring(12);
                tempCnpj = cnpj.Substring(0, 12);
                soma = 0;

                for (int i = 0; i < 12; i++)
                {
                    soma = soma + int.Parse(tempCnpj[i].ToString()) * multiplicador1[i];
                }

                resto = soma % 11;
                resto = resto < 2 ? resto = 0 : resto = 11 - resto; ;
                digito = resto.ToString();

                tempCnpj = tempCnpj + digito;

                soma = 0;
                for (int i = 0; i < 13; i++)
                {
                    soma = soma + int.Parse(tempCnpj[i].ToString()) * multiplicador2[i];
                }

                resto = soma % 11;
                resto = resto < 2 ? resto = 0 : resto = 11 - resto; ;
                digito = digito + resto.ToString();

                if (digito != verifica)
                {
                    valida = false;
                }

                switch (cnpj)
                {
                    case "11111111111111":
                        {
                            valida = false;
                            break;
                        }
                    case "22222222222222":
                        {
                            valida = false;
                            break;
                        }
                    case "33333333333333":
                        {
                            valida = false;
                            break;
                        }
                    case "44444444444444":
                        {
                            valida = false;
                            break;
                        }
                    case "55555555555555":
                        {
                            valida = false;
                            break;
                        }
                    case "66666666666666":
                        {
                            valida = false;
                            break;
                        }
                    case "77777777777777":
                        {
                            valida = false;
                            break;
                        }
                    case "88888888888888":
                        {
                            valida = false;
                            break;
                        }
                    case "99999999999999":
                        {
                            valida = false;
                            break;
                        }
                }
            }
            else
            {
                valida = false;
            }
            return valida;
        }
    }
}

Qualquer duvida ou sugestão, utilize os comentários

Publicado em Componentes | 2 Comentários

Componente .net (TextBox) que só aceita numeros.

Bom este sendo o primeiro post sobre componentes decidi fazer bem simples.
Um componente simples porem útil um textbox que só aceita números
Segue abaixo o código comentado em C# e VB .net

C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Componentes
{
    //Declara a Classe TextBoxNumeros e faz a herança com a classe 
    //TextBox
    class TextBoxNumeros : TextBox
    {
        //Faz o overrride o metodo OnKeyPress
        //Ao fazer o override você sobescreve o metodo 
        //na classe que herdou
        //Neste caso utilizarei o evento OnKeyPress que é o evento 
        //disparado quando o usuario aperta uma tecla dentro do            
        //textbox
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            //O Comando Base chama as ações na classe herdada                                                             
            //para este metodo
            base.OnKeyPress(e);

            //O atributo e.KeyChar retorna o caractere que o usuario 
            //digitou
            //No if aibaixo verificamos se ele é menor que Zero ou 
            //maior que nove na tabela ASCII
            //E se o caractere digitado não é o backspace(para 
            //permitir que o usuario apague o que digitou)
            if (((e.KeyChar < '0') || (e.KeyChar > '9')) && (e.KeyChar != '\x0008'))
            {
                //Se acaso passe pelo if ele troca o caractere por 
                //vazio x0000 da tabela ACII
                e.KeyChar = '\x0000';
            }

            //Abaixo comentado uma segunda forma 
            //de se fazer (Comentado)
            //No exemplo abaixo ao invés de comparar com o menor que       
            //zero e menor que nove
            //Eu utilizei a função Char.IsDigit() que retorna um 
            //boolean true caso o Char seja
            //digito e false caso não seja, junto com a função 
            //utilizei o simbolo de negação !
            //para passar só se a função retornar false.
            //if ((!Char.IsDigit(e.KeyChar)) && (e.KeyChar != '\x0008'))
            //{
            //    e.KeyChar = '\x0000';
            //}
        }
    }
} 

VB .net

Imports Microsoft.VisualBasic

'Declara a Classe TextBoxNumeros e faz a herança com a classe TextBox
Public Class TextBoxNumeros
    Inherits TextBox

    'Faz o overrride o metodo OnKeyPress
    'Ao fazer o override você sobescreve o metodo na classe que herdou
    'Neste caso utilizarei o evento OnKeyPress que é o evento 
    'disparado quando o usuario aperta uma tecla dentro do textbox
    Protected Overrides Sub OnKeyPress(ByVal e As KeyPressEventArgs)

        'O Comando MyBase chama as ações na classe herdada 
        'para este metodo
        MyBase.OnKeyPress(e)
        'O atributo e.KeyChar retorna o caractere que o 
        'usuario digitou
        'No if aibaixo verificamos se ele é menor que Zero ou maior 
        'que nove na tabela ASCII
        'E se o caractere digitado não é o backspace(para permitir que 
        'o usuario apague o que digitou)
        'a função ChrW() interpreta os caracteres da 
        'ASCII em decimais.
        If (((e.KeyChar < ChrW(48)) OrElse (e.KeyChar > ChrW(57))) _
                                    AndAlso (e.KeyChar <> ChrW(8))) Then
            'Se acaso passe pelo if ele troca o caractere por vazio 
            '0 da tabela ACII
            e.KeyChar = ChrW(0)

        End If

        'Abaixo comentado uma segunda forma de se fazer (Comentado)
        'No exemplo abaixo ao invés de comparar com o menor
        'que zero e menor que nove
        'Eu utilizei a função Char.IsDigit() que retorna 
        'um boolean true caso o Char seja
        'digito e false caso não seja, junto com a função 
        'utilizei o simbolo de negação
        'Not
        'para passar só se a função retornar false.
        'If (Not Char.IsDigit(e.KeyChar) AndAlso (e.KeyChar <> ChrW(8))) Then
        '    e.KeyChar = ChrW(0)
        'End If
    End Sub
End Class 

Qualquer duvida ou sugestão, utilize os comentários

Publicado em Componentes | Deixe um comentário

Ola Mundo!

Ola caro leitor(a),
Estou aqui começando este blog, pretendo postar aqui técnicas de desenvolvimento dicas de códigos e componentes .net que eu desenvolvi, para quem quiser utilizar ou modificar, mas por favor fazer referencia ao criador original sempre é bom.
Achei que o melhor jeito de começar o blog e o jeito que a gente começa na programação. Fazendo o programa mais conhecido o “Ola Mundo!”, nas linguagens que mais conheço. Segue abaixo.

Linguagem C

#include <stdio.h>
#include <conio.h>

int main()
{
     printf("Ola Mundo! ");
     getch();
}

C# (Console Application)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OlaMundo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Ola Mundo!");
            Console.ReadKey();
        }
    }
}

VB .net (Console Application)

Module OlaMundo

    Sub Main()
        Console.Write("Ola Mundo!")
        Console.ReadKey()
    End Sub

End Module

PL – SQL

print 'Ola Mundo!'

Pascal

Program olaMundo;
  Uses
    crt;

Begin
  writeln('Ola Mundo!');
  readkey;
End.

Quem quiser mais exemplos segue no link abaixo do Wikipédia.

Publicado em Ola Mundo | Deixe um comentário