Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Problemas com exibição na maskedtextbox

Recommended Posts

Ola pessoal.

Teno um código para exibir resutados de uma consulta ao MySql em textbox's.

Acontece que um dos campos do formulario, o que mostrará o CPF, tambem poderá mostrar CNPJ dependendo do valor que chega do campo "tipo" do MySql na tabela de clientes(se f ou j {Física ou Juridica}).

 

Esse é o código que estpou usando:

Private Sub exibirDados(ByVal m As Integer)
		Dim i As Integer = dt.Rows.Count - 1
		If m < 0 OrElse i < 0 Then Exit Sub
		dr = dt.Rows(m)

		Codigo.Text = dr("clienteID")
		cpf_cnpj.Text = dr("cpf_cnpj")
		cpf_cnpj2.Text = dr("cpf_cnpj")
		Nome.Text = dr("nome")
		Endereco.Text = dr("endereco")
		Bairro.Text = dr("bairro")
		Cidade.Text = dr("cidade")
		Estado.Text = dr("estado")
		Email.Text = dr("email")
		data.Text = dr("data")
		If dr("tipo") = "f" Then
			tipo1.Checked = True
			tipo2.Checked = False
				   End If
		If dr("tipo") = "j" Then
			tipo2.Checked = True
			tipo1.Checked = False
				   End If
		Telefone.Text = dr("telefone")
		IE.Text = dr("ie")
	End Sub
Acontece que o ampo que mostra o CPF ou CNPJ, é uma maskedtextbox pois não consegui uma rotina para colocar mascara na textbox.

Acontece que, para fin de textm puz tambem no form, uma textbox ao lado da maskedtextbox recebendo o mesmo valor que ela para verificar o erro e percebi que,

a makedtexbox as vezes mostra a mascara de cpf ou cnpj certo porem as vezes mostra apenas 11 dos 14 digitos do CNPJ e a textbox mostra os 14 digitos certinho. Mas, se eu insistir e clikar novamente, por exemplo, no Botao primeiro da navegação entre registros, ai a maskedtextbox mostra correto a mascara e o todos os numeros do CNPJ.

O grilo que esta na minha cabeça é por que as vezes mostra só 11 digitos e não 5 ou 6 se 11 é a quantidade de dígitos de um CPF.

 

O que eu preciso:

1) Ou uma forma de colocar mascar na textbox ou

2) como resolver esse problema.

 

O código da navegação entre os registro (em botões):

Private Sub Primeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Primeiro.Click
		registro = 0
		exibirDados(registro)
	End Sub
	Private Sub Anterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Anterior.Click
		registro = registro - 1
		If registro < 0 Then registro = 0
		exibirDados(registro)
	End Sub
	Private Sub Proximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Proximo.Click
		Dim i As Integer = dt.Rows.Count - 1
		registro = registro + 1
		If registro > i Then registro = i
		exibirDados(registro)
	End Sub
	Private Sub Ultimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Ultimo.Click
		registro = dt.Rows.Count - 1
		exibirDados(registro)
	End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

não entendi mto bem, mas você quer definir a mascara da maskedtextbox via codigo?

 

se for isso, eu fiz um exemplo pequeno usando combobox que você pode adaptar para o seu caso. O q eu fiz foi mudar a mascara quando seleciono o valor da combobox. você pode fazer isso de outras formas, atraves de um botao (por exemplo, quando você clicar para obter os dados do seu banco) e mudar a mascara de acordo como numero de caracteres que vem da tabela, etc.

 

segue o codigo.

 

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
		{
			if (comboBox1.SelectedItem.ToString() == "CPF")
			{
				maskedTextBox1.Mask = "000.000.000-00";
			}
			else
			{
				if (comboBox1.SelectedItem.ToString() == "CNPJ")
				{
					maskedTextBox1.Mask = "000.000.000/0000-00";
				}
				else
				{
					maskedTextBox1.Mask = "";
				}
			}
		}

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok só uma observação.

Não tinha mostrado onde colocava a mascara no código

Private Sub exibirDados(ByVal m As Integer)
		Dim i As Integer = dt.Rows.Count - 1
		If m < 0 OrElse i < 0 Then Exit Sub
		dr = dt.Rows(m)

		Codigo.Text = dr("clienteID")
		cpf_cnpj.Text = dr("cpf_cnpj")
		cpf_cnpj2.Text = dr("cpf_cnpj")
		Nome.Text = dr("nome")
		Endereco.Text = dr("endereco")
		Bairro.Text = dr("bairro")
		Cidade.Text = dr("cidade")
		Estado.Text = dr("estado")
		Email.Text = dr("email")
		data.Text = dr("data")
		If dr("tipo") = "f" Then
			tipo1.Checked = True
			tipo2.Checked = False
			cpf_cnpj.Mask = "###,###,###-##"
		End If
		If dr("tipo") = "j" Then
			tipo2.Checked = True
			tipo1.Checked = False
			cpf_cnpj.Mask = "##,###,###/####-##"
		End If
		Telefone.Text = dr("telefone")
		IE.Text = dr("ie")
	End Sub
Eu fiz parecido com o teu a mascara até funciona mas o problema é que algumas vezes, não são todas, onde a pessoa é juridica, coloca mascara de CNPJ certo mas só exibe 11 dos 14 digitos do CPF.

ai que ta o problema

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom resolvi o problema.

na hora da exibição fica assim:

If dr("tipo") = "f" Then
			tipo1.Checked = True
			tipo2.Checked = False

			cpf_cnpj.DataBindings.Clear()
			cpf_cnpj.Mask = "000,000,000-00"
			cpf_cnpj.DataBindings.Add("Text", ds.Tables(0), "cpf_cnpj")
		End If
		If dr("tipo") = "j" Then
			tipo2.Checked = True
			tipo1.Checked = False

			cpf_cnpj.DataBindings.Clear()
			cpf_cnpj.Mask = "00,000,000/0000-00"
			cpf_cnpj.DataBindings.Add("Text", ds.Tables(0), "cpf_cnpj")
		End If
e na hora de inserir um novo registro, fica assim:

Private Sub tipo1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tipo1.CheckedChanged
		If tipo1.Checked = True Then
			IE.Visible = False
			LabelIE.Visible = False
			tipo2.Checked = False
			cpf_cnpj.Visible = True
			Nome.Visible = True
			LabelNome.Visible = True
			LabelCPF.Visible = True
			LabelNome.Text = "Nome"
			LabelCPF.Text = "CPF:"
			cpf_cnpj.ReadOnly = False
			cpf_cnpj.DataBindings.Clear()
			cpf_cnpj.Mask = "000,000,000-00"
		End If
	End Sub
	Private Sub tipo2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tipo2.CheckedChanged
		If tipo2.Checked = True Then
			IE.Visible = True
			LabelIE.Visible = True
			tipo1.Checked = False
			cpf_cnpj.Visible = True
			Nome.Visible = True
			LabelNome.Visible = True
			LabelCPF.Visible = True
			LabelNome.Text = "Razão Social"
			LabelCPF.Text = "CNPJ: "
			cpf_cnpj.ReadOnly = False
			cpf_cnpj.DataBindings.Clear()
			cpf_cnpj.Mask = "00,000,000/0000-00"
		End If
ou seja, só tirar a atribuição de valor.

Agora o problema é similar.

tenho o código abixo para colocar a mascara na datagridview só não sei em que evento colocar:

For Each linha As DataGridViewRow In DGWClientes.Rows
			If DGWClientes.Columns.Item(10).ToString = "f" Then
				DGWClientes.Columns.Item(1).DefaultCellStyle.Format = "###,###,###-##"
			End If
			If DGWClientes.Columns.Item(10).ToString = "j" Then
				DGWClientes.Columns.Item(1).DefaultCellStyle.Format = "##,###,###/####-##"
			End If
		Next

Compartilhar este post


Link para o post
Compartilhar em outros sites

resolvi assium:

Private Sub DGWClientes_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DGWClientes.CellFormatting
		Dim d As Double
		' Aqui vem a coluna com os dados, no meu caso é a coluna 1
		If e.ColumnIndex = 1 Then
			' Vejo se tem algo preenchido e eu estou convertendo
			' para Double para aplicar uma máscara numérica
			If e.Value IsNot Nothing AndAlso _
			   Double.TryParse(e.Value.ToString(), d) Then
				Console.WriteLine(e.Value.ToString().Length)
				' Se for até 11 caracteres, considero CPF
				If e.Value.ToString().Length <= 11 Then
					e.Value = d.ToString("###'.'###'.'###-##")
					' De 12 a 14, CNPJ
				ElseIf e.Value.ToString().Length > 11 AndAlso _
					   e.Value.ToString().Length <= 14 Then
					e.Value = d.ToString("##'.'###'.'###/####-##")
				End If
			End If
		End If
	End Sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora só falta criar uma função para validar campos o fomulario como nome vazio, endereço, telefone e suas respectivas mensagens.

Como faz isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Doce ilusão foi a minha.

Quando fasso:

cpf_cnpj.DataBindings.Clear()
			cpf_cnpj.Mask = "00,000,000/0000-00"
			cpf_cnpj.DataBindings.Add("Text", ds.Tables(0), "cpf_cnpj"
Na primeira linha, cpf_cnpj.DataBindings.Clear(), eu zero o databinding e o código só pega o CPF ou CNPJ do primeiro registro toda hora.

 

Continua a procura por um código para colocar mascara na textbox e a função para validar campos não prenchidos no formulario com mensagem de cada uma.

Se alguem puder ajudar!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agora só falta criar uma função para validar campos o fomulario como nome vazio, endereço, telefone e suas respectivas mensagens.

Como faz isso?

Pra não virar bagunça cria outro tópico pra resolver este assunto citado acima.

 

Referente ao problema deste tópico e se você comentar a linha que da o clear?

 

Abraços..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo o que eu quero é o seguinte.

Na minha tabela de clientes, tem um campo "tipo" que guarda se o cliente é f ou j (Fisica ou Juridica)

Tem outro campo que guarda o CPF ou CNPJ dependendo do tipo de pessoa que é selecionada na hora de preencher o formulario. O campo se chama cpof_cnpj.

 

No formulario, tenho uma textbox que recebe e envia para o banco o valor da coluna cpf_cnpj

Eu quero é fazer uma mascara de cpf na textbox ou na maskedtextox se na textbox não tiver jeito que quando o checkbox tipo1 estiver "checked", e quan do o checkbox tipo2 estiver "checked", colocar uma mascara de cnpj.

 

Só isso!

 

Será que não tem uma forma mais facil não?

 

Um abç!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.