2014年1月7日火曜日

C# 閉じるイベントのキャンセル

親子関係のフォームを使うアプリケーションで、子のフォームを自由に出したり消したりしたい。
それだけならボタンを押されるたびにフォームの生成か破棄をすればいいだけなのだけども、
そのフォームの確保しているリソース量が多いので新しく作るたびに確保するのもなあ、と思った。
というわけで、閉じるイベントをキャンセルしてフォームを非表示にしてみる。

参考サイト
C# - フォームが閉じられるのをキャンセルする

/*---------------------------------------------------------------------------*/
this.FormClosing += delegate(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
sender.Visible = !sender.Visible;
}
/*---------------------------------------------------------------------------*/

フォーム終了時に呼び出されるイベントを追加し、
その中でFormClosingEventArgsのCancelプロパティをtrueにする。
こうするとフォームを閉じるのがキャンセルされる。
そのあとにフォームのVisibleプロパティを反転させれば完璧さ!とか思ったらだめだった。
これをやってしまうとどんなときでもフォームが閉じなくなるので、アプリケーションを終了できない!

親の閉じるボタンを押されたときは一緒に閉じてほしいので、その辺を判断できないものか。
FormClosingEventArgsの中身を調べてみたらあったぞう。

/*---------------------------------------------------------------------------*/
this.FormClosing += delegate(object sender, FormClosingEventArgs e)
{
// 閉じるボタンを押されたときに終了する
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
this.Visible = !this.Visible;
}
}
/*---------------------------------------------------------------------------*/

FormClosingEventArgsのCloseReasonプロパティがどうしてフォームが閉じるのか教えてくれる。
自分の閉じるボタンを押されたときはUserClosingが入っているようなので、その時だけ動作。

一応期待通りの動作はこれでできた。

0 件のコメント:

コメントを投稿