##状況
単一の子フォームが閉じられるまで親フォームを無効化しておくには、フォームのインスタンスをShowDialog()
で呼び出せば良い。
けれど、子フォームが複数あり、それらがすべて閉じられるまで親フォームを無効化しておきたい場合はどうしようか?
##ソース
まず、親フォームのソース。
親フォームにはボタンがひとつ張り付いていて、クリックするとbutton1_Click(~)
が呼び出される。
子フォームはSubForm
クラス。特に子フォームには書くことがなかったので、記載なし。
MainForm.cs
/// <summary>
/// 親フォームクラス
/// </summary>
public partial class MainForm : Form
{
// カウンタ
int iClosedSubForms = 0;
// 子フォーム表示数
const int iOpenedSubForms = 3;
/// <summary>
/// コンストラクタ
/// </summary>
public MainForm()
{
InitializeComponent();
}
/// <summary>
/// 子フォームを開く
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
// 指定した数分子フォームを開く
for(int i = 0; i < iOpenedSubForms; i++)
{
// 子フォームのインスタンスを作成する
SubForm frmSubForm = new SubForm();
// 子フォームのClosedイベントをSubFormClosed()にハンドルして開く
frmSubForm.Closed += new EventHandler(this.SubFormClosed);
frmSubForm.Show();
}
// 親フォーム自身を無効化しておく
this.Enabled = false;
}
/// <summary>
/// 子フォームが閉じられた時
/// </summary>
private void SubFormClosed(object sender, EventArgs e)
{
// 閉じられた子フォームの数+1
iClosedSubForms++;
// すべてのフォームが閉じられたら
if (iClosedSubForms >= iOpenedSubForms)
{
// 親フォーム自身の無効化を解除してカウンタをリセット
this.Enabled = true;
iClosedSubForms = 0;
}
}
}
##解説
###親フォーム側の準備
親フォームのメンバに開いた子フォームの数(iOpenedSubForms
)と閉じられた子フォームの数(iClosedSubForms
)を管理する変数を準備しておく。
子フォームのインスタンスが作成された時、メソッド「SubFormClosed(~)
」を子フォームのClosedイベント
にハンドルさせる。
###SubFormClosed(~)の動作
子フォームが閉じられた時に、閉じられた子フォームの数をカウントし、すべての子フォームが閉じられたら親フォームを復帰させる。