3

他のコントロールの中でも、ユーザーがオプションで入力できる TextBox フィールドを持つフォームがあります。必要なアクションを実行してフォームを閉じるbtnSubmit ボタン
もあります。 そのコードでは、コメントが存在するかどうかを確認し、存在しない場合は、終了する前にコメントを入力するかどうかをユーザーに尋ねます。Bool AskToFillCommentIfNeeded()関数を 使用して、MessageBox を表示し、コメントがまだ行われていない場合は終了する前にオプションでコメントを入力するようユーザーに求めます。 ユーザーが「はい」と答えた場合は true、それ以外の場合は false を返します。 ユーザーが [はい] をクリックした場合、フォームを閉じずに送信機能を終了する必要があるため、ユーザーはコメントを入力してから送信ボタンをもう一度押すことができます。



[編集された]コードは次のようなものです:

private void btnSubmit_Click(object sender, EventArgs e)
{
     // ask user if he wants to fill the comment : if so, exit this function
     if (AskToFillCommentIfNeeded()) { return; };

     // ... save data and exit form ...
}

このコードを非モーダル形式で使用すると、期待どおりに動作します。
しかし、btnSubmit DialogResult プロパティを OK に設定してモーダル フォームで使用しようとすると、期待どおりに動作しません。
イベント シンクを終了する代わりに、データを保存せずにフォームを閉じます。

次のようなブール値フラグを使用して、(不器用な)回避策を作成しました。

private bool isBusy = false;
private void btnSubmit_Click(object sender, EventArgs e)
{
     // clumsy attempt to avoid form exit :
     isBusy = true;

     // ask user if he wants to fill the comment : if so, exit this function
     if (AskToFillCommentIfNeeded()) { return; };

     isBusy = false;

      // ... save data and exit form ...
}

したがって、return ステートメントが実行されると、_FormClosing イベントをインターセプトし、フラグが true に設定されている場合はキャンセルします。

private void FDialog_FormClosing(object sender, FormClosingEventArgs e)
{
     // abort closing if flag is set
     e.Cancel = isBusy;
}

これは機能しますが、満足できるものではありません。
同じ動作を実現するためのより良い方法はありますか?
C# Express 2010 を使用しています。
前もって感謝します 。

ジャック・グリフィン

4

3 に答える 3

3

ダイアログが閉じないようにするには、フォームの DialogResult プロパティを None に戻すだけです。

private void btnSubmit_Click(object sender, EventArgs e)
{
     if (AskToFillCommentIfNeeded()) {
         this.DialogResult = DialogResult.None; 
         return;
     }

     // ... save data and exit form ...
}
于 2012-04-28T09:42:06.797 に答える
1

イベントのプロパティを手動で設定button.DialogResult = Noneして割り当てます。form.DialogResultbutton.Click

于 2012-04-28T09:44:12.377 に答える
0

注 : 今すぐ投稿したかったのですが、フォーラム
に新しく参加したので、自分の質問に回答するまで 8 時間待たなければなりません。
それでも、この場合、各回答にコメントを残すよりも投稿の方が良いと思います.
(つまり、私の感謝はすぐにあなたに届くことでした:-) ) .

超光速の回答ありがとうございます!
彼らはとても輝いていました。
@Hans Passant:これはまさに私が求めていた解決策でした。
@mrtofigh : button.DialogResult の変更は機能しません。それは form.DialogResult でなければなりません。
@Henk Holterman : タイトル バーの閉じるボタンについては正しいです。
ただし、ユーザーがクリックすると、アプリケーションはユーザーが何も送信するつもりがないと見なします。
これを確認するために、次のコードを追加します。

private void FDialog_FormClosing(object sender, FormClosingEventArgs e)
{
    // intercept form closing from Close box in title bar
    if (e.CloseReason == CloseReason.UserClosing)
        {
             e.Cancel = !ConfirmFormExit();
        }
}

ここで、ConfirmFormExit()は、送信せずに終了するかどうかをユーザーに尋ねる MessageBox を示す bool 関数で、 Yes の場合は true を返します。

したがって、コードは次のようになります。

private void btnSubmit_Click(object sender, EventArgs e)
{
    //  avoid form exit right now
    this.DialogResult = DialogResult.None;

    // ask user if he wants to fill the comment : if so, exit this function 
    if (AskToFillCommentIfNeeded()) { return; };

    // now is safe to return dialog result
    this.DialogResult = DialogResult.OK;

    // ... save data and exit form       
}

テストしましたが、問題なく動作します。
ありがとうございました 。
ジャック

于 2012-04-28T17:30:59.510 に答える