2

Windowsの閉じるボタン(X)を使用してフォームを閉じようとしたときに、いまいましいエラープロバイダーをオフにする方法はありますか?検証が実行され、ユーザーはフォームを閉じる前にすべてのフィールドに入力する必要があります。多くの場合、(X)ボタンを使用してフォームを閉じる傾向があるため、これはユーザビリティの問題になります。

キャンセルのボタンを配置しました。検証がfalseになり、検証も実行されます。

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

どんな助けでも大歓迎です。グーグルは、ユーザーがコマンドボタンを閉じるボタンとして使用する際に問題が発生した結果のみを示し、それも私の場合は問題を引き起こしています

4

2 に答える 2

4

ValidateChildren() メソッドは、フォームが閉じないようにします。このコードをフォームに貼り付けて修正します。

protected override void OnFormClosing(FormClosingEventArgs e) {
  e.Cancel = false;
}
于 2010-03-20T12:10:55.093 に答える
2

これは非常に簡単な修正です。フォームのClosingイベントで、フォームを離れることを示すフラグを設定します。たとえば、blnLeaveフォームがロードされたFalseときにフラグを次のように変更しますClosingTrue

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) TextBox1.Validating を処理します

        If (blnLeave) その後
            e.Cancel = False;
            戻る
        終了条件

        If String.IsNullOrEmpty(TextBox1.Text) Then
            Err.SetError(TextBox1, "必須")
            e.Cancel = True
        終了条件
        If TextBox1.Text.Contains("'") Then
            Err.SetError(TextBox1, "無効な文字")
            e.Cancel = True
        終了条件
    サブ終了

編集: OPのコメントに従って、この回答を含めるように修正しました。私の提案は、フォームのクローズドイベントを次のように処理することです

    Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) MyBase.FormClosed を処理します
        blnLeave = True
    サブ終了

ここに示すように、フォームのウィンドウ プロシージャ オーバーライドでここで処理します。

    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
    終了機能
    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
                ' システム メニューを介して終了を処理します
                blnLeave = True
            終了条件
        終了条件
        MyBase.WndProc(m)
    サブ終了
于 2010-03-20T03:06:34.350 に答える