Melhorando a validação em formulários Windows

O sistema de validação existente no ambiente Windows Forms possui pequenos problemas chatinhos, mas que podem ser contornados.

A validação de dados é feita em um evento chamado validating, existente em diversos objetos, como em caixas de texto. Programamos este evento para cada campo de um formulário Windows. Quando uma informação estiver inválida podemos fazer com que o foco fique preso na caixa.

O problema é que no .NET o validating ocorre dentro do processo de perda de foco de uma caixa. Isso quer dizer que se o usuário abrir uma tela de gravação de dados e clicar diretamente no botão gravar, sem dar foco a caixa alguma, as validações não serão executadas. Apenas serão executadas as validações das caixas que ganharam o foco.

Porém podemos resolver isso com uma codificação simples. Veja :

 

'Essa variável serve de flag, se deu erro ou não

Dim temErro As Boolean = False

 

Private Sub TextBox2_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox2.Validating

  If Not IsNumeric(TextBox2.Text) Then

    ER.SetError(TextBox2, "A caixa precisa conter números")

    temErro = True

    e.Cancel = True

  Else

    temErro = False

    ER.SetError(TextBox2, "")

  End If

End Sub

 

O evento validating usa um errorProvider e define o valor do flag

 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  ValidarTudo(Button1)

  If Not temErro Then

    MsgBox("Ok")

  End If

End Sub

 

O botão chama uma função de validação e testa o flag para fazer sua tarefa.  Eis então a função de validação:

 

Sub ValidarTudo(ByVal controlefoco As Control)

  Dim c As Control

  For Each c In Me.Controls

    c.Focus()

    controlefoco.Focus()

  Next

End Sub

 

A função recebe o botão como parâmetro. Faz um laço nos controles do formulário dando o foco ao controle e depois novamente ao botão. Dar o foco ao botão (ou qualquer outro objeto) é necessário já que o validating faz parte da seqüência de perda de foco, ou seja, o foco tem que ser retirado das caixas para que ele ocorra.

Desta forma mesmo que o usuário clique no botão de OK sem ter entrado nas caixas, o botão Ok provocará o validating das caixas para verificar se está tudo correto.