C# フォーム読み込み時別フォームを表示
C# 学習忘備録
フォーム2かフォーム3が表示されたら別フォームを上に重ねようか。
2つのパターンを紹介します。
※前回の続き
cemi6653.hatenablog.com
動作環境
Windows11 visualstudio2022 C# .net framework4.7.2 WindowsForm
事前準備
Form4とForm5を新しく追加します。
Form4とForm5はそれぞれボタンコントロールを一つ配置します。
方法
パターン1:読み込み時に表示
Form2デザインでForm2のプロパティを開き、イベントを選択。
※プロパティ画面の上側にある鍵マークの横の稲妻マーク。
イベントの動作「Shown」をダブルクリックします。
![](https://cdn-ak.f.st-hatena.com/images/fotolife/C/CEmi6653/20220829/20220829173229.png)
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(); } } }
![](https://cdn-ak.f.st-hatena.com/images/fotolife/C/CEmi6653/20220829/20220829182427.png)
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(); } } }
![](https://cdn-ak.f.st-hatena.com/images/fotolife/C/CEmi6653/20220829/20220829182507.png)
以上になります。
参考になればいいかなと思います。
まだまだ駆け出しなのでもっときれいにソースコードをかけるようにしなければ。。
またね。