DOBON.NET DOBON.NETプログラミング掲示板過去ログ

2つのフォームから1つのフォームを呼び出した場合

環境/言語:[win2k, VB2003, .NET Framework1.1]
分類:[.NET]

いつもお世話になっております。

今回、2つのフォームから1つのフォームを呼び出し呼び出したフォームからデータを持って来たいのですが、どうすればいいのかわかりませんので教えてください。

A1、A2というフォームがあってそれぞれからBというフォームを呼び出します。
呼び出したフォーム(A1orA2)が持っているデータをBに持って来たいのですが
どうすればいいでしょうか?

※A1、A2のフォームからBを呼び出す時
Private Sub btn_yobidashi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_group.Click
 Dim f As New formB
 f.ShowDialog(Me)
End Sub

※Bのフォーム上での処理
Private Sub formB_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim str As String = CType(Me.Owner, FormA1).TextBox1.Text <----????

me.textbox1.text = str <-----????
End Sub

何かいい知恵をお貸しください。
宜しくお願いします。
■No23063に返信(真冬さんの記事)
方法の1つとして、
BのコンストラクタにA1またはA2のデータを受け取るための引数を設定
してみてはいかがでしょう?
カドルドエグさん、こんばんわ

引数が設定できるのですか?
どのような方法で行なえばよろしいのでしょうか?


■No23065に返信(カドルドエグさんの記事)
> ■No23063に返信(真冬さんの記事)
> 方法の1つとして、
> BのコンストラクタにA1またはA2のデータを受け取るための引数を設定
> してみてはいかがでしょう?
真冬さん
カドルドエグさんが書かれた変数とは違うかもしてませんが、


「別のフォームのデータを取得、設定する」
http://dobon.net/vb/dotnet/form/accessanotherformdata.html

も参照されたらいかがでしょう。
きいよさん、こんばんわ

もちろん、「別のフォームのデータを取得、設定する」は参考に何度も拝見させて頂きました。
しかしながらここでいうForm1の部分が、私のプログラムではForm1だったりForm3だったりするので、そこをどうしたらいいか悩んでいます。

何かお知恵はないでしょうか?

==========================================================
'Form1のTextBox1.Textの値を取得
Dim str As String = CType(Me.Owner, Form1).TextBoxText

'Form1のTextBox1.Textの値を設定
CType(Me.Owner, Form1).TextBoxText = "こんにちは。"
==========================================================



■No23072に返信(きいよさんの記事)
> 真冬さん
> カドルドエグさんが書かれた変数とは違うかもしてませんが、
>
>
> 「別のフォームのデータを取得、設定する」
> http://dobon.net/vb/dotnet/form/accessanotherformdata.html
>
> も参照されたらいかがでしょう。
■No23073に返信(真冬さんの記事)
要はそれぞれにどこかしら共有部分を作るということです。
私のやり方の場合は、
Bをインスタンス化するときに呼び出し元に引数を使ってデータ(例えば文字列)を要求するやり方です。
※VBでの引数付コンストラクタは「MyBase」で検索すると作り方がわかると思います。

引数を介して渡してもらったデータは、
B内にグローバル変数を作ってその変数の中にデータを持っておくイメージです。
ただし、インスタンス生成後では、B内でのデータの変更はできますが、
別な値をまた呼び出し元から持ってきて変更することはできません。
BにA1またはA2のデータを「持ってくるだけ」ならこの方法が利用できます。

きいよさんが提示してくださったページ = こちらの掲示板の管理人さんである、
どぼんさんのサンプルは、インスタンス生成後でも呼び出し元で自由に値を取得・設定できる方法です。


>しかしながらここでいうForm1の部分が、私のプログラムではForm1だったりForm3だったりするので、そこをどうしたらいいか悩んでいます。
サンプルでは2つのフォーム間なので、3つある場合は???ということでしょうか。
「共有されるフォームはどれで、どのフォームが共有するか」
をまとめてみるとわかりやすいと思います。

真冬さんが今回行いたいのは、
>呼び出したフォーム(A1orA2)が持っているデータをBに持って来たい
ので
A1→B←A2
ということですよね。

そうなると、BにはA1とA2のデータをもらうための受け皿が必要になります。
その受け皿がプロパティであったり引数であったり、と考えるとわかりやすいと思います。
因みに今回はA1とA2の2種類があるので、(仕様や真冬さんがどうしたいかにもよりますが)
単純にはその分だけ受け皿が必要ということです。

また、もしA1←→B←→A2
と双方向であれば、A1とA2にもそれぞれBのデータをもらうための受け皿を作る必要がでてきます。
■No23073に返信(真冬さんの記事)
>> BのコンストラクタにA1またはA2のデータを受け取るための引数を設定
>> してみてはいかがでしょう?
> 引数が設定できるのですか?
> どのような方法で行なえばよろしいのでしょうか?
引数付きの New() をつくるだけだけど、本来の New() を呼んだり、
幾つか作法がありますし、オーバーロードになることも理解しておく
べきでしょう。経験の浅い人が作ると新たな不具合を生みそうなので、
素直にメソッドかプロパティを自作するのでいいのでは?

>私のプログラムではForm1だったりForm3だったりするので
Form2 で Owner を使って呼び出し側のフォームにアクセスしようと
するからですね。

文字列を渡せばいいだけなら、Form2 にプロパティを自作して
呼び出し側(Form1、Form3)から値を設定してみては?
これなら、Form2 では渡されてくる文字列を表示すればいいだけで、
誰(Form1、Form3)が渡すかは意識しなくて済みますよね?
どのフォームでもないところに、
グローバル変数を作ったらいいのでは?
A から B を呼び出した時点で B から A を参照しないような作りを心がけた方が早いと思いますね。
必要な情報があるなら A から B に渡しておけば良いのですから。

○ A →→ B
× A ←→ B
お返事が遅くなってしまい、ごめんなさい。

色々なご意見、ありがとうございます。

とりあえず、まだまだ超初心者の私にはインスタンス化は理解するのに
時間が掛かりそうなのでるしぇさんのいうプロパティを使って
やってみることにしました。

インスタンス化については、もっと勉強して早く理解して
使えるようにしたいと思います。

みなさん、有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板