3

私はすでにキャンセルボタンで causevalidation を false に設定しており、それは機能しています。

bool IsCancelBtnClicked = false;
private void EmployeeIDtextBox_Validating(object sender, CancelEventArgs e)
{
    if (EmployeeIDtextBox.Text == "")
    {
        MessageBox.Show("Please Enter EmployeeID.", "Invalid EmployeeID");
    }
}

private void button3_Click(object sender, EventArgs e)
{
    IsCancelBtnClicked = true;
    EmployeeIDtextBox.Validating -= new CancelEventHandler(textBox4_Validating);
    this.Close();
}

また

private void button3_Click(object sender, EventArgs e)
{
     AutoValidate = AutoValidate.Disable;
     Close();
}

必要なのは、windowsform? の Close[X]box で CauseValidation を false に設定することです。フォーム自体で CauseValidation を false に設定しようとしましたが、うまくいきませんでした。Close[X]box を押すたびに、メッセージボックスが表示されます。

4

2 に答える 2

4

Form クラスは、フォームを閉じる前に ValidateChildren を自動的に実行します。Validating イベント ハンドラーで e.Cancel = true を設定するコントロールがある場合、[閉じる] ボタンが機能しなくなります。あなたがしなければならないのは、関係なくフォームを閉じることを許可することだけです. このコードをフォームのソース コードに貼り付けます。

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

ErrorProvider の代わりに MessageBox.Show() に文句を言い、ShowDialog ( ) の代わりに Show() でウィンドウを表示した場合は、より大きな武器が必要です。これには、Winforms が ValidateChildren() メソッドを実行してメッセージ ボックスをトリガーする前に、早期に検証を無効にする必要があります。このコードをフォーム クラスに貼り付けます。

    protected override void WndProc(ref Message m) {
        const int WM_CLOSE = 0x10;
        if (m.Msg == WM_CLOSE) {
           base.AutoValidate = System.Windows.Forms.AutoValidate.Disable;
        }
        base.WndProc(ref m);
    }
于 2013-05-13T14:05:58.120 に答える
0

フォームが破棄されているかどうかを確認します。

if (this.IsDisposed)
{
    if (EmployeeIDtextBox.Text == "")
    {
        MessageBox.Show("Please Enter EmployeeID.", "Invalid EmployeeID");
    }
}
于 2013-05-13T13:11:06.970 に答える