TEXTBOX COM CPF - CNPJ - DATA

 Tópico anterior Próximo tópico Novo tópico

TEXTBOX COM CPF - CNPJ - DATA

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#388517 - 05/11/2011 00:29:02

DOUGLASBRAGA
VARGINHA
Cadast. em:Outubro/2011


 Anexos estao visíveis somente para usuários registrados

Boa noite pessoal!
É o seguinte estou disponibilizando um codigo com 3 TextBox, onde no primeiro TextBox se digita o CPF, o segundo o CNPJ e o terceiro a DATA.
Meu problema:
-Gostaria de Limitar a quantidade de caracteres digitados nos TextBox, tipo o CPF ###.###.###-##
-Outra coisa, nao consigo apagar o que foi digitado nos TextBox
-Estou precisando desse codigo Para os TextBox mesmo, nao posso usar o "MaskedTextBox"
-OBS: Estou usando o vb 2008

Segue em anexo o projeto, e o tambem o codigo logo abaixo:

Public Class Form1

    Private Sub TextBox2_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox2.KeyPress

        If IsNumeric(e.KeyChar) AndAlso TextBox2.TextLength < TextBox2.MaxLength Then
            TextBox2.Text &= e.KeyChar
            TextBox2.SelectionStart = TextBox2.TextLength
            Call formatacnpj(TextBox2)
        End If
        e.Handled = True
    End Sub

    Private Sub formatacnpj(ByVal txtTexto As Object)
        If Len(txtTexto.Text) = 2 Or Len(txtTexto.Text) = 6 Then
            txtTexto.Text = txtTexto.Text & "."
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        End If

        If Len(txtTexto.Text) = 10 Then
            txtTexto.Text = txtTexto.Text & "/"
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        End If
        If Len(txtTexto.Text) = 15 Then
            txtTexto.Text = txtTexto.Text & "-"
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        End If
    End Sub

    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

        If IsNumeric(e.KeyChar) AndAlso TextBox1.TextLength < TextBox1.MaxLength Then
            TextBox1.Text &= e.KeyChar
            TextBox1.SelectionStart = TextBox1.TextLength
            Call formatacpf(TextBox1)
        End If
        e.Handled = True

    End Sub
    Private Sub formatacpf(ByVal txtTexto As Object)
        If Len(txtTexto.Text) = 3 Then
            txtTexto.Text = txtTexto.Text & "."
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        ElseIf Len(txtTexto.Text) = 7 Then
            txtTexto.Text = txtTexto.Text & "."
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        ElseIf Len(txtTexto.Text) = 11 Then
            txtTexto.Text = txtTexto.Text & "-"
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        End If
    End Sub


    Private Sub TextBox3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox3.KeyPress

        If IsNumeric(e.KeyChar) AndAlso TextBox3.TextLength < TextBox3.MaxLength Then
            TextBox3.Text &= e.KeyChar
            TextBox3.SelectionStart = TextBox3.TextLength
            Call FormataDataD(TextBox3)
        End If
        e.Handled = True

    End Sub

    Private Sub FormataDataD(ByVal txtTexto As Object)
        If Len(txtTexto.Text) = 2 Then
            txtTexto.Text = txtTexto.Text & "/"
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        ElseIf Len(txtTexto.Text) = 5 Then
            txtTexto.Text = txtTexto.Text & "/"
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        End If
    End Sub



End Class




Resposta escolhida #388527 - 05/11/2011 09:18:09

RODRIGOFERRO
VIANA
Cadast. em:Junho/2009


Amigão bom dia, voce vai ter um trabalho a mais e sempre vai aparecer um bugzinho chato pra tratar todas as entradas de textos e posições...

tem ciência de que estas literalmente reinventando a roda ?

Abraços

Estou voltando... Olá a todos... Já posso dizer, ("Ja lhes falei mais de mil vezes... HIAUhIAHIAUhAIUHAIUA")
- Chuck Norris usa o Notepad como banco de dados relacional.
- Chuck Norris sabe falar em códigos binários.



#388528 - 05/11/2011 09:26:02

ALEXPASSOS
EUNAPOLIS
Cadast. em:Abril/2006


Porque você não pode usar o MaskedTextBox? Poderia explicar?

Alex Passos

#388529 - 05/11/2011 09:31:23

OMAR2011
MONTES CLAROS
Cadast. em:Setembro/2011


Douglasbraga;quanto a limitação de caracteres digitados,basta ir em propriedades
Do Textbox1.text e marcar em  MaxLengt a quantidade desejada.
Para Cpf =14 e CNPJ =18
Ou

Private Sub formatacpf(ByVal txtTexto As Object)
        If Len(txtTexto.Text) = 3 Then
            txtTexto.Text = txtTexto.Text & "."
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        ElseIf Len(txtTexto.Text) = 7 Then
            txtTexto.Text = txtTexto.Text & "."
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
        ElseIf Len(txtTexto.Text) = 11 Then
            txtTexto.Text = txtTexto.Text & "-"
            txtTexto.SelectionStart = Len(txtTexto.Text) + 1
            txtTexto.MaxLength = 14
        End If
    End Sub
Quanto a limpar as caixas de textos eu uso  “Setas” e  Delete.Tem uma outra
Maneira que fiz um teste e deu certo para limpar toda caixa de texto.

Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress

        If IsNumeric(e.KeyChar) AndAlso TextBox1.TextLength < TextBox1.MaxLength Then
            TextBox1.Text &= e.KeyChar
            TextBox1.SelectionStart = TextBox1.TextLength
            Call formatacpf(TextBox1)
        End If
        e.Handled = True
        If e.KeyChar = Convert.ToChar(8) Then
            e.Handled = True
            TextBox1.Text = ""
        End If
    End Sub

Se algum Fera puder responder melhor e mais eficaz,vou ficar atento neste tópico e grato pela informação.Não sei fazer de outra forma.




#388533 - 05/11/2011 10:33:28

ARCADYUM
BELO HORIZONTE
Cadast. em:Fevereiro/2009


Douglas,
Recentemente encontrei uma função muito bacana. Não testei todas as possibilidades da função. Mas deixo o link onde encontrá-la.
http://www.linhadecodigo.com.br/Artigo.aspx?id=383

Diferença entre Software e Hardware: Software é o que você xinga Hardware é o que você chuta.

#388536 - 05/11/2011 11:27:22

OMAR2011
MONTES CLAROS
Cadast. em:Setembro/2011


Arcadyum,baixei e observei os códigos.Semelhante ao de Douglasbraga.Mas com esse exemplo ainda não é do jeito que ele quer.Como eu disse acima.
Esperarei que alguém responda com um código ou exemplo do jeito que ele quer.

Se algum Fera puder responder melhor e mais eficaz,vou ficar atento neste tópico e grato pela informação.Não sei fazer de outra forma.



#388541 - 05/11/2011 12:25:02

ARCADYUM
BELO HORIZONTE
Cadast. em:Fevereiro/2009


Omar,
Realmente os códigos na classe são iguais. Porém, quais são as vantagens:

  - Todas as formatações ficam na classe, não tendo que criar uma função ou procedimento para cada situação.
  - Posso chamar a função de qualquer parte do projeto, basta passar a opção e o nome do componente.  

Então vamos avaliar os problemas do Douglas.

-Gostaria de Limitar a quantidade de caracteres digitados nos TextBox, tipo o CPF ###.###.###-##

A limitação dos caracteres digitados podem ser feitos na própria classe. Como eu passo, por parâmetro, o nome do componente quer dizer que qualquer propriedade do mesmo pode ser tratada lá.

Exemplo:
Para CPF

           Case OpcaoFormata.ParaCPF

                txtTexto.MaxLength = 14

                If Len(txtTexto.Text) = 3 Then

                    txtTexto.Text = txtTexto.Text & "."
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1

                ElseIf Len(txtTexto.Text) = 7 Then

                    txtTexto.Text = txtTexto.Text & "."
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1

                ElseIf Len(txtTexto.Text) = 11 Then

                    txtTexto.Text = txtTexto.Text & "-"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1

                End If


Para CNPJ

Case OpcaoFormata.ParaCNPJ

               txtTexto.MaxLength = 18

                If Len(txtTexto.Text) = 2 Or Len(txtTexto.Text) = 6 Then

                    txtTexto.Text = txtTexto.Text & "."
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1

                End If

                If Len(txtTexto.Text) = 10 Then

                    txtTexto.Text = txtTexto.Text & "/"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1

                End If

                If Len(txtTexto.Text) = 15 Then

                    txtTexto.Text = txtTexto.Text & "-"
                    txtTexto.SelectionStart = Len(txtTexto.Text) + 1

                End If


A única desvantagem que vejo neste método e ficar determinando o valor da propriedade sempre que digito alguma coisa, mas, isso pode ser resolvido se o componente que vai receber o valor de CPF ou CNPJ for determinado antes, tipo: Escolher através de um RadioButton, Combobox ou mesmoCheckBox fica a critério do usuário.

- Outra coisa, nao consigo apagar o que foi digitado nos TextBox

Neste caso disponibilizo o código que utilizo para resolver esse problema, que tive também.

Em um módulo coloque este código:

Public Function SO_NUMERO(ByVal Keyascii As Short) As Short

        If InStr("1234567890", Chr(Keyascii)) = 0 Then
            SO_NUMERO = 0
        Else
            SO_NUMERO = Keyascii
        End If

        Select Case Keyascii

            Case 8
                SO_NUMERO = Keyascii
            Case 13
                SO_NUMERO = Keyascii
            Case 32
                SO_NUMERO = Keyascii
        End Select

    End Function

No textbox, no evento KeyPress, coloque este código

  Dim KeyAscii As Short = CShort(Asc(e.KeyChar))
        KeyAscii = CShort(SO_NUMERO(KeyAscii))

        Select Case KeyAscii
            Case 0
                e.Handled = True
            Case Is = 13
                SendKeys.Send("{TAB}")
            Case Is >= 47
                CLFUNGERAL.FORMATAR_CAMPO_GERAL(FUNGERAL.OpcaoFormata.ParaElemento, TXT_ELEMENTO)
        End Select

    End Sub

A função verifica o que você está digitando, dependendo do retorno, não exibe nada, ou muda o foco ao digitar Enter, ou formata conforme sua necessidade.

Permite apagar de qualquer forma: com BackSpace, Delete, selecionar tudo e Deletar.

-Estou precisando desse codigo Para os TextBox mesmo, nao posso usar o "MaskedTextBox"

Funciona com o textbox, conforme meu uso e testes.

-OBS: Estou usando o vb 2008
Neste caso uso o VS 2010 Ultimate, mas não custa testar.

Espero que ajude.
Um Abraço.





Diferença entre Software e Hardware: Software é o que você xinga Hardware é o que você chuta.

#388542 - 05/11/2011 12:29:12

ARCADYUM
BELO HORIZONTE
Cadast. em:Fevereiro/2009


Omar,
outra vantagem da classe é que ela pode ser declarada pública em um módulo não precisando de declara-la toda vez que for usada. Eu uso assim e funciona. No mesmo módulo que você colocar a função SO_NUMERO declare a função no escopo.
Exemplo:
Public CLFUNGERAL As New FUNGERAL 'Classe que possue a função FORMATAR_CAMPO_GERAL
No meu exemplo acima usei para elemento, mas pode ser declarada a que o usuário quiser.

Diferença entre Software e Hardware: Software é o que você xinga Hardware é o que você chuta.

#388561 - 05/11/2011 18:38:26

DOUGLASBRAGA
VARGINHA
Cadast. em:Outubro/2011


Última edição em 05/11/2011 18:40:50 por DOUGLASBRAGA

Boa tarde a todos!
Pessoal consegui resolver o meu problema...
Segui o conselho do ZEROCAL, e deixei de usar o TextBox e usei o MaskedTextBox mesmo.
No meu projeto, eu tenho uma Combobox, onde possui as opçoes "pessoa fisica" e"pessoa juridica" e eu queria mudar os " ###.###.###-###" do CPF para ##.###.###/### do CNPJ no TextBox.
Encontrei aquele codigo que eu postei no inicio do topico, tentei modificar mas nao cosegui.
Eu nao queria usar o MaskedTextBox pq eu nao sabia que eu conseguiria mudar o "Mask"' das propriedades via codigo.
Dai usando o MaskedTextBox consegui, e ficou bem simples, segue o meu codigo:

If CombPessoa.SelectedItem = "Pessoa Física" Then
            Me.MaskedCPF.Mask = "000.000.000-00"
Else
            If CombPessoa.SelectedItem = "Pessoa Juridica" Then
                Me.MaskedCPF.Mask = "00.000.000/000"
                
Pessoal, sou iniciante e pouco a pouco vou pegando os macetes...
Obrigado pela ajuda de todos!



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por DOUGLASBRAGA em 05/11/2011 18:41:59