Errorprovider показывает ошибку при использовании кнопки закрытия Windows (X)

Есть ли способ отключить провайдер проклятых ошибок, когда я пытаюсь закрыть форму с помощью кнопки закрытия окна (X). Он запускает проверку, и пользователь должен заполнить все поля, прежде чем он сможет закрыть форму ... это будет проблемой для удобства использования, потому что многие, как правило, закрывают форму с помощью кнопки (X).

Я разместил кнопку для отмены с причинами проверки на ложь, а также запускает проверку.

Я обнаружил, что кто-то говорит, что если вы используете функцию Form.Close (), выполняются проверки ... как я могу обойти эту раздражающую функцию.

у меня есть структура MDI, и я показываю форму, используя

 CreateExam.MdiParent = Me
        CreateExam.Show()

в элементе меню родительского mdi щелкните

и иметь это как установленную проверку

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

Любая помощь очень ценится. googling показал результаты только тогда, когда у пользователей возникла проблема с использованием командной кнопки в качестве кнопки закрытия, и это тоже вызывает проблему в моем случае


person Pankaj Kumar    schedule 20.03.2010    source источник


Ответы (2)


Метод ValidateChildren () предотвращает закрытие формы. Вставьте этот код в свою форму, чтобы исправить это:

protected override void OnFormClosing(FormClosingEventArgs e) {
  e.Cancel = false;
}
person Hans Passant    schedule 20.03.2010

Это довольно простое исправление: в событии Closing вашей формы установите флаг, указывающий на выход из формы, например blnLeave, когда форма загружается, установите флаг на False, когда событие Closing запускается, установите для него значение True в этом обработчик событий, то изменение, как показано ниже, будет

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

Изменить: внесены поправки в этот ответ для включения в соответствии с комментариями OP. Мое предложение - обработать закрытое событие формы, как показано

    Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
        blnLeave = True
    End Sub

И обработайте это здесь, в переопределении оконной процедуры формы, как показано здесь ...

    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
person t0mm13b    schedule 20.03.2010
comment
большое спасибо ... он работает ... но при втором щелчке .... как только я нажимаю кнопку закрытия, появляется сообщение об ошибке, а при втором щелчке он позволяет закрыть форму ....... .. есть ли способ предотвратить это ??? - person Pankaj Kumar; 20.03.2010
comment
@Pankaj: обработайте событие Form.Close и установите там флаг ... возможно, вам придется добавить переопределение, создав подкласс формы ... Я исправлю этот ответ, чтобы проиллюстрировать это .... - person t0mm13b; 20.03.2010
comment
спасибо, что нашли время ответить. Я буду использовать ответ nobugz в качестве принятого решения. - person Pankaj Kumar; 22.03.2010