Win フォームアプリでフォーム間のデータ受け渡し

2022年7月25日

Windwosフォームアプリは、それぞれがクラスで管理されています。そして、実際に画面に表示する時には、インスタンスを作成することで実現します。

サンプルの作成

フォームを作成する

新規プロジェクトを作成します。

プロジェクト名 FormTransData

空のフォーム(Form1,Form2)を2つ作成します

ソリューションエクスプローラでプロジェクトを右クリックして、新しくフォームを追加

Form1にボタンを1つ追加します。(button1)

ツールボックスからForm1にD&Dして追加

ボタン追加によってコードが自動的に作成されていることを確認します。

// 名前空間は簡略化しています
Button button1;
button1 = new Button();
button1.Location = new Point(392, 305);
button1.Name = "button1”;
button1.Size = new Size(195, 79);
button1.TabIndex = 0;
button1.Text = "button1";
button1.UseVisualStyleBackColor = true;
button1.Click += new EventHandler(this.button1_Click);
Controls.Add(button1);

ボタンを押下するとForm2が表示されるコードを記述します

button1のクリックイベントを作成します。

  • Form2のインスタンスを作成して、form2変数に代入します
  • Show()メソッドで画面に表示するようにします。
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
}

新しいフォームが表示されることを確認

プログラムを実行します。

  • Form1のボタンをクリックします。
  • Form2が表示されることを確認します。

Form2からForm1へのデータ受け渡し(Form1側で取得)

Form2側作業

受け渡し用の元データを作成します。

Form2のフィールドで宣言、代入します。

public int form2Point = 200;

Form1側作業

Form1のボタンクリックイベントにデータの受け取りを追記します。

int point = form2.form2Point;

結果をボタンに表示するコードを追記します。

button1.Text = point.ToString();

プログラムを実行します。

  • ボタンをクリックします。
  • Form2のデータが表示されていることを確認します。

Form1からForm2へのデータ受け渡し(Form2側で取得)

Form1側作業

受け渡し用の元データを作成します。

Form1のフィールドで宣言、代入します。

public int form1Point = 100;

Form2は Form1のインスタンスを知らないため、取得する処理を追加します。
具体的には、Form2のインスタンスが作成されるタイミングで、Form1のインスタンスを取得する(Form1から渡す)ようにします。

Form2のインスタンス作成の変更

自分自身(インスタンス)をコンストラクタの引数として渡します。

Form2 form2 = new Form2(this);

Form2側作業

Form1のコンストラクタを保持しておくための変数を宣言します。

Form2のフィールドで宣言します。

private Form1 form1;

引数が1つのコンストラクタを追記します。

  • コンポーネントの初期化メソッドの追記
  • 渡された引数(Form1のインスタンス)をフィールドに代入するコードの追記
public Form2(Form1 form1)
{
    InitializeComponent();
    this.form1 = form1;
}

ボタンを追加します。(button1)

ツールボックスからForm2にD&Dして追加

ボタンクリックイベントにデータの受け取りを追記します。
int point = form1.form1Point;

結果をボタンに表示します。

button1.Text = point.ToString();

プログラムを実行します。

  • Form1のボタンをクリックします。
  • ボタンにForm2のデータが表示されているのを確認します。
  • Form2のボタンをクリックします。
  • ボタンにForm1のデータが表示されているのを確認します。
  • Form1のボタンを押下するたびに新しいForm2のインスタンスが作成されることを確認します。

サンプルコード

using System;
using System.Windows.Forms;
namespace FormTransData
{
    public partial class Form1 : Form
    {
        public int form1Point = 100;
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(this);
            form2.Show();
            int point = form2.form2Point;
            button1.Text = point.ToString();
        }
    }
}
using System;
using System.Windows.Forms;
namespace FormTransData
{
    public partial class Form2 : Form
    {
        private Form1 form1;
        public int form2Point = 200;
        public Form2()
        {
            InitializeComponent();
        }
        public Form2(Form1 form1)
        {
            InitializeComponent();
            this.form1 = form1;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int point = form1.form1Point;
            button1.Text = point.ToString(); ;
        }
    }
}