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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top