web-dev-qa-db-ja.com

c#AcceptButtonと検証

こんにちは私はいくつかのテキストボックスと2つのボタンキャンセルとOKを含むフォームを持っています。これらのボタンは、フォームのボタンプロパティを受け入れたりキャンセルしたりするために割り当てられています。問題は、すべてのテキストボックスに入力されたテキストを検証する必要があることです。

ユーザーがクリックした場合にそれを実行したいOkボタン(acceptButton))そこで、検証を担当する関数を作成し、ユーザーがクリックした場合にこの関数を起動しますOkボタン。問題は、検証関数がfalseを返しても、フォームが閉じるのを停止できないことです。これは、acceptbuttoプロパティをOkボタンに割り当てたために発生します。 acceptbuttonプロパティを削除せずに検証が失敗した場合に、フォームが閉じないようにする方法はありますか?

23
exMode

これは私たちが使用する実用的なソリューションです(そしてそれは他の回答からコンパイルされたものです)。

フォームが閉じないようにするには、DialogResultNoneに設定する必要があります。

//form init, auto-generated code (this is the case described)
private void InitializeComponent()
{
    //....
    this.AcceptButton = btnOk;
    this.btnOk.DialogResult = DialogResult.OK;
    //....
}

//event handlers
private void btnOK_Click(object sender, EventArgs e)
{
    if (!Validate())
        this.DialogResult = DialogResult.None;
}

private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.None)
        e.Cancel = true;
}
34
Alex

Okボタンクリックハンドラーで、検証が失敗したときにDialogResultをDialogResult.Noneに変更します

7
Vinay B R

1つの方法は、OnFormClosingイベントで検証を適用し、検証結果に基づいてアクションをキャンセルすることです。

-編集-

_private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult == DialogResult.OK)
    {
        if (!IsValid())
        {
            Info("Invalid data");
            e.Cancel = true;
        }
        else
        {
            Info("Valid data found, closing dialog");
        }
    }
    else if (this.DialogResult == DialogResult.Cancel)
    {
        Info("Just cancelling!");
    }
}
_

また、キャンセル/ OKイベントでthis.Close();を呼び出すことができます。

または、[OK]ボタンの実装で、ボタンの DialogResult を変更し、Noneに設定することもできます。

_acceptButton.DialogResult = DialogResult.None;
_
6
KMån

フォームにAcceptButtonプロパティを設定したり、ボタンからDialogResultプロパティを削除したりしないでください(代わりにDialogResult.Noneに設定してください)。

代わりに、検証コードでフォームのDialogResultプロパティを設定できます。

 if (allFieldsValidated) {
     DialogResult = DialogResult.OK;
 }
1
Patrick

Button.DialogResultを設定しないでくださいデザイナまたは他の場所で(Form.DialogResultと混同しないでください)。ボタンのクリックハンドラーで検証を行い、成功した場合はForm.DialogResultをDialogResult.OKに設定して、フォームを閉じます。

private void OkBtn_Click(object sender, EventArgs e)
{
    if (isValid())
    { 
      this.DialogResult = DialogResult.OK;
      this.Close();
    }
}
0
seemoewe