CEmi6653’s blog

忘備録

C# フォーム読み込み時別フォームを表示

C# 学習忘備録

フォーム2かフォーム3が表示されたら別フォームを上に重ねようか。
2つのパターンを紹介します。

※前回の続き
cemi6653.hatenablog.com


動作環境
Windows11 visualstudio2022 C# .net framework4.7.2 WindowsForm

事前準備
Form4とForm5を新しく追加します。
Form4とForm5はそれぞれボタンコントロールを一つ配置します。

方法
パターン1:読み込み時に表示

Form2デザインでForm2のプロパティを開き、イベントを選択。
※プロパティ画面の上側にある鍵マークの横の稲妻マーク。
イベントの動作「Shown」をダブルクリックします。

Formプロパティのイベント

Form2.csに書き込みます。

Form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace hatenaForm
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            Form1 form1 = new Form1();
            form1.ShowDialog();
            this.Close();
        }

        private void Form2_Shown(object sender, EventArgs e)
        {
            Form4 form4 = new Form4();
            form4.ShowDialog();
        }
    }
}

Form4.cs クリックイベントで閉じるだけ。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace hatenaForm
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
フォームを閉じる場合は読み込み時に表示

Form2のLoadイベントだとフォームの生成前の話なのでForm4が表示されない。
Form4を生成されてからでないと、コンストラクタが使用できないためShownイベントを使用。
※後で、データの受け渡しをするときにShownじゃないと渡せなかったからShownにしています。


パターン2:Showを重ねがけ。一番上に表示させたフォームしか操作させたくないためShowDialog():を使用。

Form5.cs にフィールドを配置,ボタンクリックイベントでフォームを非表示
Form5.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace hatenaForm
{
    public partial class Form5 : Form
    {
        public Form5()
        {
            InitializeComponent();
        }

        //ただ一つのフォームのインスタンスを保持するフィールド
        private static Form5 _instance;

        //ただ一つのフォームにアクセスするためのプロパティ
        public static Form5 Instance
        {
            get
            {
                //_instanceがnullまたは破棄されているときは、
                //新しくインスタンスを作成する
                if (_instance == null || _instance.IsDisposed)
                {
                    _instance = new Form5();
                }
                return _instance;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form3.Instance.Show();
            
        }
    }
}

Form5をShowDialog表示する

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace hatenaForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        //ただ一つのフォームのインスタンスを保持するフィールド
        private static Form1 _instance;

        //ただ一つのフォームにアクセスするためのプロパティ
        public static Form1 Instance
        {
            get
            {
                //_instanceがnullまたは破棄されているときは、
                //新しくインスタンスを作成する
                if (_instance == null || _instance.IsDisposed)
                {
                    _instance = new Form1();
                }
                return _instance;
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            Form2 form2 = new Form2(); 
            form2.ShowDialog();
            this.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //パターン2
            this.Hide();
            Form3.Instance.Show();
            Form5.Instance.ShowDialog();
            
        }
    }
}
フォームを順番に表示させるだけ。


以上になります。
参考になればいいかなと思います。
まだまだ駆け出しなのでもっときれいにソースコードをかけるようにしなければ。。

またね。