C# Formの画面遷移 見せ方
C#の忘備録
組み込み系でね、画面構築をしたときに少し苦戦したから残します。
動作環境
windows11 64bit visualstudio2022 コミュニティ .net framework4.7.2 WindowsForm
以下の2つをご紹介します。
・Formを作成、削除の場合(closeで閉じる場合)
・FormをShowとhideで表示非表示
まず、「プロジェクト名」を右クリックでメニューを出し、「追加」で「フォーム」を選択。
フォームを2つ作成します。※デフォで「Form2.cs」Form2はパターン1用、Form3はパターン2用
Form1デザイナーでボタンコントロールを2つ、Form2,Form3のデザイナーでボタンコントロールを一つずつ配置します。
配置は、デザイナー画面左側にあるのツールボックスのbuttonを選択し、Formデザイン内にドラッグ&ドロップ(掴んで離す)
ちなみにコントロールの詳細はコントロール選択後にプロパティで表示。
コントロールの名前を変えることは多い。プロパティのTextにデフォでbottun1と入力されているので変更すれば画面上の文字表示が変わります。
※ここでは詳細は説明しないので色々触ってみて。
Form1のボタンコントロールをダブルクリックでクリックイベント時のコードを表示、書き込みます。
パターン1:Showで開き、クローズで閉じる(毎回新しくフォームを作っている)
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 void button1_Click(object sender, EventArgs e) { this.Visible = false; Form2 form2 = new Form2(); form2.ShowDialog(); this.Close(); } } }
同じく、Form2に書き込みます。
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(); } } }
this.Visible = false;で現在のフォームを非表示にします。
フォームを生成します。
ShowもしくはShowDialogで表示します。
this.Closeで現在のフォームを閉じます。
パターン1:完了。
パターン2:フォームをshowとHideで使い分け。
※こちらのほうが業務上多く使います。(個人の実践値)
フィールドでインスタンス情報を保持(Form情報)条件分岐でFormがあったら作成するし、なかったら作成しない
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 Form3.Instance.Show(); this.Hide(); } } }
フィールドを配置
Form3.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 Form3 : Form { public Form3() { InitializeComponent(); } //ただ一つのフォームのインスタンスを保持するフィールド private static Form3 _instance; //ただ一つのフォームにアクセスするためのプロパティ public static Form3 Instance { get { //_instanceがnullまたは破棄されているときは、 //新しくインスタンスを作成する if (_instance == null || _instance.IsDisposed) { _instance = new Form3(); } return _instance; } } private void button1_Click(object sender, EventArgs e) { //パターン2 Form1.Instance.Show(); this.Hide(); } }
Showで指定しているフォームを表示します。
this.Hideで現在のフォームを非表示にします。
dobon.netを参考にしました。
動かしてみてください。