24

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

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

4

5 に答える 5

35

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

フォームが閉じないようにDialogResulttoを設定するだけです。None

//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;
}
于 2011-06-28T12:02:20.357 に答える
8

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

于 2010-09-26T11:48:32.037 に答える
6

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!");
    }
}

this.Close();また、Cancel/Ok イベントを呼び出すこともできます。

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

acceptButton.DialogResult = DialogResult.None;
于 2010-09-26T11:45:36.657 に答える
1

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

private void OkBtn_Click(object sender, EventArgs e)
{
    if (isValid())
    { 
      this.DialogResult = DialogResult.OK;
      this.Close();
    }
}
于 2015-05-10T10:41:38.357 に答える
1

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

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

 if (allFieldsValidated) {
     DialogResult = DialogResult.OK;
 }
于 2010-09-26T11:44:39.493 に答える