Desenvolvimento - Visual Basic .NET
Validação de controles – WinForms
A validação de controles para aplicações Windows (winforms) é uma tarefa um pouco mais complicada do que a validação em asp.net, isto porque as aplicações Windows não possuem a facilidade dos controles Validators do Asp.net.
por Alexandre TarifaUma maneira de validar os controles seria criar a própria função de validação, que é o que vamos ver neste artigo: uma rotina genérica de validação de controles.
Vamos criar uma função poderá ser chamada a qualquer momento na aplicação, esta função será responsável pela validação.
Codificação
Inicie um novo projeto do tipo Visual Basic e com o template Windows Aplication (figura 1).
Desenhando o formulário
Ao criar a solução, um formulário já é criado form1. Nas propriedades do formulário (F4), altere as propriedades: Name: frmValidacao e Text: Validando Controles.
Criaremos um formulário de cadastro simples de clientes, onde iremos adicionar diversos controles aleatórios para efetuar a validação. Monte um formulário conforme a imagem abaixo:
Para a validação dos controles vamos criar uma classe chamada clnValidaControles, para adicionar no menu Project> Add Class.
O primeiro passo na nossa classe será a criação de um Enum (listagem 1) (é um tipo que trata um conjunto de valores definidos, ou seja, uma lista de tipos que possui um valor atribuído).
Public Enum OpcaoConsiste VerNulo = 1 VerNumerico = 2 VerData = 3 verCep = 4 verCNPJ = 5 End Enum
Criamos uma lista de tipos de validação que utilizaremos dentro da nossa rotina de tratamento. Estes tipos foram criados para demonstração, caso queira implementar outro tipo basta adicionar uma nova linha com o tipo e o seu valor de índice.
Após criar o Enum, vamos criar a função genérica com o nome gfConsisteCampos:
Public Function gfConsisteCampos(ByVal Controle As System.Windows.Forms.Control, ByVal tipoOpcao _ As OpcaoConsiste As Boolean
Nesta função teremos como parâmetro Controle que será o controle a ser validado e tipoOpcao do tipo OpcaoConsiste, nome do nosso Enum.
Obs. A vantagem da utilização do Enum é que ao chamar a nossa função, ele mostra a lista contida no Enum evitando a possibilidade de erro durante a execução.
Vamos tratar todos as opções de consistência inseridas no Enum, sendo que a primeira será a do tipo VerNulo para TextBox e ComboBox:
Select Case tipoOpcao "Faz o case se o opção selecionada for a VerNulo Case OpcaoConsiste.VerNulo "Verifica se o controle é um TextBox If TypeOf Controle Is TextBox Then "Verifica se valor do controle é Vazio If Controle.Text = String.Empty Then "Exibe uma mensagem MsgBox("O Campo: " & Controle.Tag & " deve ser Preenchido!!!", MsgBoxStyle.Information, "Faturamento") "Altera a cor de fundo para amarelo Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False "Caso o valor não seje Vazio Else "Altera a cor de fundo para branco Controle.BackColor = System.Drawing.Color.White Return True End If ElseIf TypeOf Controle Is ComboBox Then If Controle.Text = String.Empty Or Controle.Text = "(Selecione a Opção Desejada)" Then MsgBox("O Campo: " & Controle.Tag & " deve ser Selecionado!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If End Select
Os comentários foram adicionados somente no primeiro bloco de código pois este bloco será somente repetido para todos os outros controles. Notem a utilização da propriedade TAG ao exibir a mensagem. Todos os controles devem ter esta propriedade preenchida de acordo com o nome do campo para melhor entendimento do usuário quando a mensagem for exibida.Para testar nossa função, vamos chamá-la no evento click do botão btnValidar. Vamos validar o controle TextBox txtRazaoSocial. Clique duas vezes no botão Validar e digite o seguinte código:
Dim validacao As New clnValidaControles If validacao.gfConsisteCampos(txtRazaoSocial, clnValidaControles.OpcaoConsiste.VerNulo) = False Then Exit Sub
Estamos chamando a função consiste campos para o controle txtRazaoSocial e chamando item do Enum VerNulo. Caso a função retorne nulo, paramos o programa. Note a vantagem da utilização do Enum na imagem abaixo:
Para testar o programa execute (F5), não digite nenhum valor para Razão Social e clique no botão Validar.
A mensagem de alerta é disparada e o campo fica com a cor amarela. Clique em OK e digite alguma valor para Razão Social, clique novamente em Validar e nenhum alerta será exibido e o campo Razão Social voltará a ficar com o fundo branco.
Agora é simples basta continuar a nossa classe com todos os tipos de tratamentos desejados, segue abaixo a classe completa:
Select Case tipoOpcao Case OpcaoConsiste.VerNulo If TypeOf Controle Is TextBox Then If Controle.Text = String.Empty Then MsgBox("O Campo: " & Controle.Tag & " deve ser Preenchido!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If ElseIf TypeOf Controle Is ComboBox Then If Controle.Text = String.Empty Or Controle.Text = "(Selecione a Opção Desejada)" Then MsgBox("O Campo: " & Controle.Tag & " deve ser Selecionado!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If ElseIf TypeOf Controle Is RichTextBox Then If Controle.Text = String.Empty Then MsgBox("O Campo: " & Controle.Tag & " deve ser Selecionado!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If ElseIf TypeOf Controle Is ListBox Then If Controle.Text = String.Empty Then MsgBox("O Campo: " & Controle.Tag & " deve ser Selecionado!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If End If Case OpcaoConsiste.VerNumerico If Not IsNumeric(Controle.Text) Then MsgBox("O Campo: " & Controle.Tag & " deve ser Numérico!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If Case OpcaoConsiste.VerData If Not IsDate(Controle.Text) Then MsgBox("O Campo: " & Controle.Tag & "!!! Formato Inválido!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If Case OpcaoConsiste.verCep If Not IsNumeric(Left(Controle.Text, 5)) Or Mid(Controle.Text, 6, 1) <> "-" Or Not IsNumeric(Right(Controle.Text, 2)) Then MsgBox("Campo: " & Controle.Tag & "!!! Formato Inválido!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If Case OpcaoConsiste.verCNPJ Dim blnResultado As Boolean Dim strCNPJ As String strCNPJ = Controle.Text strCNPJ = Replace(strCNPJ, ".", "") strCNPJ = Replace(strCNPJ, "/", "") strCNPJ = Replace(strCNPJ, "-", "") If Not IsNumeric(strCNPJ) Or Len(strCNPJ) <> 14 Then blnResultado = False End If Dim Conta As Integer, Soma As Long, Passo As Integer Dim Digito1 As Integer, Digito2 As Integer, Flag As Integer strCNPJ = Trim(strCNPJ) For Passo = 5 To 6 Soma = 0 Flag = Passo For Conta = 1 To Passo + 7 Soma = Soma + (Val(Mid(strCNPJ, Conta, 1)) * Flag) Flag = IIf(Flag> 2, Flag - 1, 9) Next Soma = Soma Mod 11 If Passo = 5 Then Digito1 = IIf(Soma> 1, 11 - Soma, 0) If Passo = 6 Then Digito2 = IIf(Soma> 1, 11 - Soma, 0) Next If (Digito1 = Val(Mid(strCNPJ, 13, 1)) And Digito2 = Val(Mid(strCNPJ, 14, 1))) Then blnResultado = True Else blnResultado = False End If If blnResultado = False Then MsgBox("Campo: " & Controle.Tag & "!!! CNPJ Inválido!!!", MsgBoxStyle.Information, "Faturamento") Controle.BackColor = System.Drawing.Color.FromArgb(CType(255, Byte), CType(255, Byte), CType(128, Byte)) Controle.Focus() Return False Else Controle.BackColor = System.Drawing.Color.White Return True End If End Select End Function
Existem diversas formas das validações dos controles, está é uma que eu mesmo criei e que traz um resultado muito bom pela facilidade de utilização. Para baixar o projeto clique aqui.
Em caso de dúvidas, sugestões, críticas, etc entrem em contato comigo atarifa@deloitte.com.
Um Grande Abraço
Alexandre Tarifa
- Entity Framework 4: Repositório GenéricoVisual Basic .NET
- As edições 14 da Easy .net Magazine e 88 da .net Magazine já estão disponíveis.ADO.NET
- Postando no Twiiter com .NET e Migre.meC#
- Setup ApplicationsVisual Basic .NET
- Problemas na manipulação de arquivos do MS Excel com .NETVisual Basic .NET