VB.NET2005Expressで開発している初心者です。
使用上Form1のテキストボックス1をクリックして、Form2を出した後、Form2のテキストボックスに値を入れてOKボタン押下後Form2を閉じて、Form1のテキストボックス1に値を反映させます。直接Form1のテキストボックス1に値を入れられればいいのですが…
この様な仕掛けはどうすればいいのか見当がつきません。何か良い方法があれば教えて下さい。お願いします。
> 直接Form1のテキストボックス1に値を入れられればいいのですが…
Form2 が Form1 の TextBox に直接値を返す方法で実装することは可能です。
(方法は幾つかありますが、Owner を指定する方法や、My に頼る方法など)
しかし、そのように Form2 を Form1 の存在を前提とした設計にしてしまうと、
拡張性に乏しくなりがちです。
たとえば「Form3 や Form4 からも、 Form2 を呼び出したい」とか、
「Form1 の TextBox に返す直前に、何か別の処理を行わせたい」いった
要求が増えた場合、そのたびに Form2 を修正しなければいけなくなりますよね。
この場合は、「Form2 で入力された値を、Form2 が、Form1 の TextBox に入れる」のではなく、
「Form2 で入力された値を、Form1 が、Form1 自身の TextBox に入れる」ようにします。
たとえば、Form2 を「ユーザ名を入力させる画面」だと仮定して、そのユーザ名を
自作プロパティで返すようにするなら、このような実装になります。
=============
'呼び出す側のフォーム。TextBox と Button を貼っておいてください。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Using dialog As New Form2()
If dialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
'OK が押されたら、ユーザ名を受け取る。
Me.TextBox1.Text = dialog.UserName
Else
'キャンセルが押された場合。
MessageBox.Show("キャンセルされました。")
End If
End Using
End Sub
End Class
'呼び出される側のユーザ名入力フォーム。TextBox 1 つと、Button 2 つです。
Public Class Form2
'ロード時の処理。これらは、デザイン時に指定しておいてもOKです。
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1.Text = "OK"
Button1.DialogResult = System.Windows.Forms.DialogResult.OK
Button2.Text = "キャンセル"
Button2.DialogResult = System.Windows.Forms.DialogResult.Cancel
End Sub
'本題。入力されたユーザ名を返すプロパティを実装しています。
Private _userNameValue As String = ""
Public Property UserName() As String
Get
Return _userNameValue
End Get
Private Set(ByVal value As String)
_userNameValue = value
End Set
End Property
'OK ボタンの処理。
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
'自作した UserName プロパティに、TextBox の値を入れておきます。
Me.UserName = Me.TextBox1.Text
End Sub
End Class
=============
このようにすると、Form2 側は「どのフォームから呼ばれたのか」を意識せずに済むため、
呼び出すフォームを変更する場合にも、柔軟に対応できます。
なお上記は「プロパティ」を使った実装例ですが、「メソッド」や「イベント」を使う方法もあります。
たとえば、上記のユーザ名入力画面のように、返す内容が文字列 1 つだけの場合には、
プロパティで返すのではなく、メソッドの戻り値として返す方が便利かも知れません。
これはいわば、InputBox 関数のような実装になります。InputBox を呼び出す場合は、
Dim userName As String
userName = InputBox("ユーザー名を入れてください")
If userName <> "" Then
TextBox1.Text = userName
End If
のように書くことができますよね。Form2 側を、これと同じような実装にするわけです。
また、ShowDialog メソッドでの「モーダル ダイアログ」としての呼び出しではなく、
Show メソッドでの「モードレス ダイアログ」としての呼び出しが必要な場合には、
イベントを使った方法で実装すると良いでしょう。
Public変数を宣言すれば簡単かも
ツイート | ![]() |