プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

C#でForm1からForm2を参照する

C#でFormを複数作ったときに他のFormのデータ(変数やオブジェクトの中身)にアクセスしたいときがあると思います。
しかし、アクセスが拒否されてどうするんだっけ?となります。

下図はForm2からForm1のテキストボックスの中身を取得しようとしてはじかれているところです。
f:id:s51517765:20201010172201p:plain

何度もつくっているはずですが、何度も調べなおしているのでここでまとめておこうと思います。

パターンは以下です。
・Form1でForm1の内容をFormXへ送る。
・FormXでForm1の内容をFormXへ送る。

これができれば、
・Form1でFromXの内容をFormXへ送る。
・FormXでForm1の内容をFormYへ送る。
等もできるはずです。

基本・Formを増やす

メニューバーのプロジェクトから「Windowsフォームの追加」を開きWindowsフォームを選択します。
f:id:s51517765:20201010173321j:plain
f:id:s51517765:20201010173334p:plain

これをButtonに割り当てるなどし、Formを追加します。

private void button1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2(); //インスタンスを作成
        form2.Show();  //form2を表示する
    }

これはForm2のインスタンスをform2という名前で作成する、というものです。
これは、オブジェクト指向の初歩でよく言われる、Form2という「たいやき型」もしくは「設計図」でform2というたいやきを生成したということです。

Form1でForm1の内容をForm2へ送る

ここでは、Form1のボタンを押下したときにFormを生成しForm1のテキストボックスの内容を新しく生成したFormのlabel1にセットする、とします。
まず、あたらしく生成されるForm内の目的のオブジェクト(ここではlabel1)のプロパティのModifiersをPublicにします。
f:id:s51517765:20201010175533j:plain
デフォルトはPrivateとなっていて、これは他のClass(他のform)からはアクセスできない状態になっています。
form2.label1.Text = textBox1.Text;のようにform2のlabel1にアクセスします。

if (textBox1.Text != "")
{
    Form2 form2 = new Form2();
    form2.Show();
    form2.label1.Text = textBox1.Text;
}

Form2でForm1の内容をForm2へ送る

下図のようにForm2のボタンを押したとき、Form1のテキストボックスの中身をForm2のlabelにセットします。
Form2はForm1から生成されるものとします。
f:id:s51517765:20201010174639p:plain

Form1のtextboxもPublicにしておきます。

Form2を生成するButton_ClickイベントはForm1自身を参照として渡します。

private void button2_Click(object sender, EventArgs e)
{
    //Form2のインスタンスを form2という名前で作成しForm1自身を参照として渡す
    Form2  form2 = new Form2(this);     

    //フォームを表示する
    form2.Show();
}

Form2にもForm1の参照を追加します。

public partial class Form2 : Form
{
    Form1 form1; //Form1を宣言

    public Form2(Form1 form1) //form1の参照を追加
    {
        InitializeComponent();
        this.form1 = form1; // //ここでいうform1は参照しているfomr1
    }

    private void Form2_Load(object sender, EventArgs e)
    {
    }

    private void button3_Click(object sender, EventArgs e)
    {
        label2.Text = form1.textBox1.Text;
    }
}

これでForm間のやりとりが出来ます。