ErrorProvider mostra o erro ao usar o botão de fechar Windows (x)
-
21-09-2019 - |
Pergunta
Existe alguma maneira de desligar o maldito provedor de erros quando tento fechar o formulário usando o botão Windows Close (x). Ele dispara a validação e o usuário precisa preencher todos os campos antes que ele possa fechar o formulário. Este será um problema de usabilidade, porque muitos tendem a fechar o formulário usando o botão (x).
Coloquei um botão para cancelar com a validação de causas para false e também dispara uma validação.
Encontrei alguém dizendo que, se você usar o Form.Close (), as validações da função são executadas ... como posso superar esse recurso irritante.
Eu tenho uma esturutura de MDI e mostro o formulário usando
CreateExam.MdiParent = Me
CreateExam.Show()
No clique Menuitem do pai do MDI
e tenha isso como validação definida
Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If String.IsNullOrEmpty(TextBox1.Text) Then
Err.SetError(TextBox1, "required")
e.Cancel = True
End If
If TextBox1.Text.Contains("'") Then
Err.SetError(TextBox1, "Invalid Char")
e.Cancel = True
End If
End Sub
Qualquer ajuda é muito apreciada. O Google só mostrou resultados em que os usuários estavam tendo problemas usando um botão de comando como o botão de fechar e isso também está causando problemas no meu caso
Solução
O método validateChildren () impede o fechamento do formulário. Cole este código em seu formulário para consertar isso:
protected override void OnFormClosing(FormClosingEventArgs e) {
e.Cancel = false;
}
Outras dicas
Esta é uma correção bastante simples, na sua forma Closing
Evento, defina um sinalizador para indicar deixar o formulário, por exemplo blnLeave
, quando o formulário for carregado, defina a bandeira como False
, quando o Closing
o evento é acionado, defina isso para True
Dentro desse manipulador de eventos, a mudança da seguinte
Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating If (blnLeave) Then e.Cancel = False; Return End If If String.IsNullOrEmpty(TextBox1.Text) Then Err.SetError(TextBox1, "required") e.Cancel = True End If If TextBox1.Text.Contains("'") Then Err.SetError(TextBox1, "Invalid Char") e.Cancel = True End If End Sub
Editar: Alterou esta resposta para a inclusão, de acordo com os comentários do OP. Minha sugestão é lidar com o evento fechado do formulário, como mostrado
Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed blnLeave = True End Sub
E lidar com isso aqui no procedimento da janela do formulário, como mostrado aqui ....
Private Const SC_CLOSE As Integer = &HF060 Private Const WM_MENUSELECT As Integer = &H11F Private Function LoWord(ByVal Num As Integer) As Integer LoWord = Num & &HFFFF End Function Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = WM_MENUSELECT Then If LoWord(m.WParam.ToInt32()) = SC_CLOSE Then ' Handle the closing via system Menu blnLeave = True End If End If MyBase.WndProc(m) End Sub