質問

私は窓の閉じるボタン(X)を使用して、フォームを閉じるしようとすると、オフのろわエラープロバイダを有効にする方法はあります。これは、検証を発射すると、ユーザは多くの人が(X)ボタンを使用して、フォームを閉じる傾向があるため、彼はユーザビリティの問題になりますform..thisを閉じることができます前に、すべてのフィールドを埋めるために持っています。

私はfalseに原因の検証と、キャンセルボタンを配置している、それはまた、検証を発射します。

私はあなたがForm.Closeを使用している場合()関数の検証が実行されていることを言って誰かを見つけました... どのように私はこの迷惑な機能を乗り越えることができます。

私は、MDIのstuructureを持っていると

を使用してフォームを表示します
 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

すべてのヘルプははるかに高く評価されます。 ユーザーは、私の場合には、問題を引き起こしている近すぎるボタンとしてコマンドボタンを使用して問題を持つとされた場所のみ示した結果をグーグル

役に立ちましたか?

解決

はValidateChildren()メソッドは、閉鎖からフォームを防止します。修正にフォームにこのコードを貼り付けていること:

protected override void OnFormClosing(FormClosingEventArgs e) {
  e.Cancel = false;
}

他のヒント

これは非常に簡単な修正は、フォームの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のコメントにつきとして含めるため、この答えを修正しました。示すように、私の提案は、フォームのClosedイベントを処理することです。

    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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top