Errorprovider показывает ошибку при использовании кнопки закрытия окна (X) - PullRequest
2 голосов
/ 20 марта 2010

Есть ли способ отключить проклятый провайдер ошибок, когда я пытаюсь закрыть форму, используя кнопку закрытия окна (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

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

Ответы [ 2 ]

4 голосов
/ 20 марта 2010

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

protected override void OnFormClosing(FormClosingEventArgs e) {
  e.Cancel = false;
}
2 голосов
/ 20 марта 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

Редактировать: Исправлен этот ответ для включения в соответствии с комментариями ОП. Я предлагаю обработать закрытое событие формы, как показано

    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
...