別画面のテキストボックスに値を入れるには?


おばQ  2007-05-11 07:17:37  No: 136375

VB.NET2005Expressで開発している初心者です。
使用上Form1のテキストボックス1をクリックして、Form2を出した後、Form2のテキストボックスに値を入れてOKボタン押下後Form2を閉じて、Form1のテキストボックス1に値を反映させます。直接Form1のテキストボックス1に値を入れられればいいのですが…
この様な仕掛けはどうすればいいのか見当がつきません。何か良い方法があれば教えて下さい。お願いします。


魔界の仮面弁士  2007-05-11 18:54:02  No: 136376

> 直接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 メソッドでの「モードレス ダイアログ」としての呼び出しが必要な場合には、
イベントを使った方法で実装すると良いでしょう。


____  2007-05-30 01:11:29  No: 136377

Public変数を宣言すれば簡単かも


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加