フォーム間でのデータの受け渡しについてどのようにするのかという質問が多いように思われる。タイプとしては、あるフォームで入力したデータを、そのフォームが閉じた時に取得するというものと、 あるフォームを開いたままで、別のフォームが任意のタイミングで取得するというものがある。順番にサンプルコードを提示したいと思う。
1.フォームを閉じたタイミングで更新
C#
//Form2からForm3を呼び出し、Form3からForm2にデータをコピーします。 public partial class Form2 : Form { public Form2() { InitializeComponent(); } public string TestText { set { //テキストボックスに書き込む this.textBox1.Text = value; } } private void button1_Click(object sender, EventArgs e) { Form3 frm = new Form3(); //Form2をオーナーフォームに指定しておく frm.ShowDialog(this); } } public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //渡したいフォームを取得 Form2 frm = this.Owner as Form2; //渡したいデータを書き込む frm.TestText = this.textBox1.Text; this.Close(); } }
VB.NET
'Form2からForm3を呼び出し、Form3からForm2にデータをコピーします。 Public Class Form2 Public WriteOnly Property TestText() As String Set(ByVal value As String) 'テキストボックスに書き込む Me.TextBox1.Text = value End Set End Property Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim frm As Form3 = New Form3() 'Form2をオーナーフォームに指定して開く frm.ShowDialog(Me) End Sub End Class Public Class Form3 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click '渡したいフォームを取得 Dim frm As Form2 = CType(Me.Owner, Form2) '渡したいデータを書き込む frm.TestText = Me.TextBox1.Text Me.Close() End Sub End Class
2.任意のタイミングで別フォームのデータを取得
C#
//Form4からForm5を呼び出し、Form5からForm4にデータをコピーします。 public partial class Form4 : Form { //入力するフォームの変数を用意しておく Form5 _frm; public Form4() { InitializeComponent(); _frm = new Form5(); //フォームを表示するが、モーダル表示にしてはいけない。 _frm.Show(); } private void button1_Click(object sender, EventArgs e) { //データをコピーする this.textBox1.Text = _frm.TestText; } } public partial class Form5 : Form { public Form5() { InitializeComponent(); } public string TestText { get { return this.textBox1.Text; } } }
VB.NET
'Form4からForm5を呼び出し、Form5からForm4にデータをコピーします。 Public Class Form4 '入力するフォームの変数を用意しておく Private _frm As Form5 Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load _frm = New Form5() 'フォームを表示するが、モーダル表示にしてはいけない。 _frm.Show() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'データをコピーする Me.TextBox1.Text = _frm.TestText End Sub End Class Public Class Form5 Public ReadOnly Property TestText() As String Get Return Me.TextBox1.Text End Get End Property End Class