ネタ元:http://social.msdn.microsoft.com/Forums/ja-JP/vbgeneralja/thread/ab93fbf6-b7d8-4de8-ab59-6b52f4658e65
掲示板を巡回してると、必ず1つや2つは見当たるForm間の値の受け渡しネタ。
何パターンかやってみようと思います。ちなみに、コードをなるべく簡単にするために、Form1内の値をForm2で取得することしかしません。
まず、全パターン共通の部分から作っていきます。
SampleAppという名前でWindows Form Applicationを作成します。
今回は2画面必要なので、Form2を追加して2画面作っておきます。
そして、Form1とForm2を以下のようにデザインします。
最悪のパターン
いきなり敵意のありそうなタイトルですが、ネタ元でVB6の頃にしていたであろうパターンを書いてみようと思います。
まず、プロジェクトにモジュールを追加します。(名前はデフォルトのModule1にしました)
そして、Publicなフィールドを1つ追加します。
Module Module1
Public Form1Text As String
End Module
こいつは、グローバルにアクセスできるのでForm1とForm2からさくっとアクセスできます。なので、Form1のボタンクリックイベントにこういう風に書いて
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' モジュールに入れといて
Module1.Form1Text = TextBox1.Text
' Form2表示!
Form2.Show()
End Sub
End Class
そして、Form2のLoadイベントでModule1から値を取得してラベルに表示させます。
Public Class Form2
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' モジュールからテキストを取得
Label1.Text = Module1.Form1Text
End Sub
End Class
実行して動きを確認します。
まぁ凄く小さなものを作るならお手軽でいいかな。
Form1からForm2に値を渡してやる系
個人的には、こっちのほうが好きです。
Form1とForm2の間で値を渡すためだけに、グローバルにアクセスできる変数を作るなんて、勿体無いです。Form3からもForm4からもForm5からもアクセス出来る上に、アクセスすると、きっと本来意図したのと違う動きをしてしまう。
ということで、さくっといきます。Form2に、外部から文字列をセットするためのプロパティを1つ定義します。
Public Class Form2
' ラベルのテキストを取得または設定する
Public Property LabelText() As String
Get
Return Label1.Text
End Get
Set(ByVal value As String)
Label1.Text = value
End Set
End Property
End Class
後は、Form1でForm2を表示する前に渡してやります。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' 今回はちゃんとForm2のインスタンス作るよ
Dim form2 As New Form2
' ラベルにテキストを設定して表示
form2.LabelText = Me.TextBox1.Text
form2.Show()
End Sub
End Class
ということで、なるべくシンプルになるように書いてみた、Form1とForm2の値の受け渡しでした。