1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【C#】複数の子フォームが閉じられるまで親フォームを無効化しておく

Last updated at Posted at 2015-03-08

##状況
単一の子フォームが閉じられるまで親フォームを無効化しておくには、フォームのインスタンスを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(~)の動作
子フォームが閉じられた時に、閉じられた子フォームの数をカウントし、すべての子フォームが閉じられたら親フォームを復帰させる。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?