C#でFormを複数作ったときに他のFormのデータ(変数やオブジェクトの中身)にアクセスしたいときがあると思います。
しかし、アクセスが拒否されてどうするんだっけ?となります。
下図はForm2からForm1のテキストボックスの中身を取得しようとしてはじかれているところです。
何度もつくっているはずですが、何度も調べなおしているのでここでまとめておこうと思います。
パターンは以下です。
・Form1でForm1の内容をFormXへ送る。
・FormXでForm1の内容をFormXへ送る。
これができれば、
・Form1でFromXの内容をFormXへ送る。
・FormXでForm1の内容をFormYへ送る。
等もできるはずです。
基本・Formを増やす
メニューバーのプロジェクトから「Windowsフォームの追加」を開きWindowsフォームを選択します。これを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にします。
デフォルトは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から生成されるものとします。
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間のやりとりが出来ます。