他のコントロールの中でも、ユーザーがオプションで入力できる 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 を使用しています。
前もって感謝します 。
ジャック・グリフィン