TEXTBOX COM CPF - CNPJ - DATA
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
é 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
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
tem ciência de que estas literalmente reinventando a roda ?
Abraços
Porque você não pode usar o MaskedTextBox? Poderia explicar?
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.
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.
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
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
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.
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.
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.
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.
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.
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.
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!
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 encerrado , respostas não são mais permitidas