Ontem um aluno me fez um questionamento quando estava explicando sobre o controle ErrorProvider do Windows Forms. A questão é quando utilizamos o evento Validating de algum controle, como por exemplo, o TextBox, para validarmos um determinado valor, se esta condição não for atendida e, tentarmos fechar o formulário, a validação é disparada e, sendo assim, até que ela não seja atendida, o formulário não será fechado, pois o evento Validating do(s) controle(s) são disparados antes do fechamento definitivo do formulário. O código abaixo ilustra isso:
Private Sub TextBox1_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If Me.TextBox1.Text = String.Empty Then
Me.ErrorProvider1.SetError(Me.TextBox1, “Digite algo..”)
e.Cancel = True
End If
End Sub
Private Sub TextBox1_Validated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles TextBox1.Validated
Me.ErrorProvider1.SetError(Me.TextBox1, String.Empty)
End Sub
Só que o problema, como já vimos, se tentarmos fechar o formulário e o TextBox ainda estiver vazio, a validação é feita e, a propriedade Cancel é definida como True, cancelando assim a finalização do processo e o fechamento do formulário. A solução neste caso é sobrescrever o método OnClosing do Form e definir o Cancel do argumento como False, forçando assim o fechamento do formulário. Logo, precisamos apenas adicionar o seguinte trecho de código:
Protected Overrides Sub OnClosing(ByVal e As System.ComponentModel.CancelEventArgs)
e.Cancel = False
End Sub