CEmi6653’s blog

忘備録

C# Formの画面遷移 見せ方

C#の忘備録
組み込み系でね、画面構築をしたときに少し苦戦したから残します。

動作環境
windows11 64bit visualstudio2022 コミュニティ .net framework4.7.2 WindowsForm

以下の2つをご紹介します。
・Formを作成、削除の場合(closeで閉じる場合)
・FormをShowとhideで表示非表示

まず、「プロジェクト名」を右クリックでメニューを出し、「追加」で「フォーム」を選択。

visualstudio2022 フォームの追加

フォームを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を参考にしました。
動かしてみてください。