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 Tarifa



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. Para as aplicações winforms, foi criado o errorProvider (http://www.linhadecodigo.com.br/artigos.asp?id_ac=184), porém este facilitador na validação não chega a ser tão completo como os validators da web.

Uma 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

Alexandre Tarifa

Alexandre Tarifa - Ministra palestras e treinamentos, MVP (Most Valuable Professional), MCAD (Microsoft Certified Application Developer) e MCT (Microsoft Certified Trainer). Bacharel pela UMESP e pós-graduando pela Universidade Federal de São Carlos em Ciência da Computação. Analista de Sistemas e Líder do grupo de usuários Codificando.net São Paulo (sp.codificando.net). Escreve artigos para a revista MSDN Magazine e para os sites Linha de Código, MSDN Brasil e Enterpriseguys.
Visite o blog do autor: http://weblogs.pontonetpt.com/alexandretarifa/.