- PR -

別フォームに値を渡す方法

投稿者投稿内容
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-18 12:38
別のスレッドでも質問中なのですが、それと同時にまた問題が出てきましたので質問させていただきます。

VB.NETのWinフォームにて開発中です。

仕様については以下の通りです。

-------------------------------------------------------------

Mainのフォームにテキストボックスとボタンを配置しています。
これが2組あります。AとBとします。

AのボタンをクリックするとDLL化された検索サブ画面Aが表示されます。
検索画面にて項目を選択すると、MainフォームのAのテキストボックスに検索結果が表示されます。

そのAのテキストボックスの検索結果を元に、次にBのボタンをクリックしDLL化された検索サブ画面Bを表示させ、検索サブ画面B内の検索対象テキストボックスにAのテキストボックスの値を入れたいと思っています。
その後検索サブ画面Bで選択した値をまたMainフォームのBのテキストボックスに値を戻す処理を行っています。

-------------------------------------------------------------

ソース(一部抜粋)

-------------------------------------------------------------

Mainフォームのボタンは下記のような設定になっています。

Me.BtnA = New A画面.SearchA(Me.components)
Friend WithEvents BtnA As A画面.SearchA

Me.BtnB = New B画面.SearchB(Me.components)
Friend WithEvents BtnB As B画面.SearchB


SearchA及びSearchBは各画面のコンポーネントクラスで、各画面から値をMainフォームに引き渡すためのプロパティとイベントを下記のように書いています。


'-----------------------------------------------------------------------------
' プロパティ名 : GETCD
' 機能 : 検索結果から指定したコードを格納
'-----------------------------------------------------------------------------

Public Property GET_CD() As String
Get
Return _GET_CD
End Get
Set(ByVal Value As String)
_GET_CD = Value
End Set
End Property


'-----------------------------------------------------------------------------
'関数名 : OnClick
'機能 : ボタン押下時の処理
'返り値 :
'引き数  :
'機能説明 : 名称検索画面を表示、検索画面より項目取得
'備考 :
'-----------------------------------------------------------------------------
Protected Overrides Sub OnClick(ByVal e As System.EventArgs)

'マスタ検索
Dim frm As New A画面.A画面_Form

'画面表示
frm.ShowDialog()
'検索結果を格納
Me.GET_CD = frm.GET_CD 'コード格納

MyBase.OnClick(e)

End Sub


-------------------------------------------------------------


この上記のB画面用コンポーネントクラスのOnClickイベントのfrm.ShowDialog()の前に、MainフォームのAのテキストボックスの値を取得してやればいいんだろうなと思うのですがやり方がさっぱりわかりません。

コマンドライン引数?とか、MainフォームにPublic変数を用意してAのテキストボックスの値を入れておく?とかいろいろ考えてみたのですがわからずじまいです。。。

別に大した問題でもなさそうなのですが、周りに聞いて答えられる人もおらず、私は初心者の為わからないことだらけです。
わかりやすく教えていただけませんでしょうか?

よろしくお願いいたします。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-01-18 13:32
> 検索サブ画面Bを表示させ、検索サブ画面B内の検索対象テキストボックスにAのテキストボックスの値を入れたいと思っています。

表示してから値を入れるのではなく、表示する前に値を設定しておくようにすればよいのです。

B画面を生成->表示している箇所で、下記の様にしてみてはいかがでしょう?
コード:
'B画面のインスタンス生成
Dim frm As New B画面.B画面_Form 

'値をB画面に設定
frm.SET_CD = [Aテキストボックス].Text

'B画面表示 
frm.ShowDialog() 


*frm.SET_CDは別途B画面に用意してくださいね。

あとはB画面のPage_Loadなどで、検索対象テキストボックスにSET_CDの値をセットすれば良いのではないでしょうか。
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-18 13:49
くまっち様

早速の返信ありがとうございます。

しかしひとつ問題がありまして…
また初歩的な質問であれば、本当に申し訳ないのですが。。。

ちょっと書き込みが足りなかった、うまく伝えきれていなかったのかもしれないです。


Mainフォームでひとつのソリューションです。
A画面、B画面は別のプロジェクトでDLL化されています。

共通処理の為DLL化しており、ほかのソリューションで使用することを想定しています。
なのでB画面のソースではMainフォームのBのテキストボックスは直接参照できません。

またこのMainフォームだけではなく、他のソリューションでも同じように使用できるようにB画面のDLLを作成しておきたいと思っております。

なので元画面(今回の場合だとMainフォーム)内にAテキストボックスに値が代入されたイベントが発生した場合にパブリック変数にその値を入れておき、B画面ではその変数の値を常に参照するというようにしたいというのが理想です。
それだとB画面をもう触ることもないし、呼び出し元画面のイベントに一つ処理を書いておくだけで終わりということになります。


くまっちさんがおっしゃったようにする場合は、同じソリューションにB画面があった時の話だと思います。
MainフォームのAテキストボックス(たとえばTxtAとします)を、DLL化されたB画面でもらう方法はありますでしょうか??
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-01-18 14:06
なるほど。B画面のDLL自体は修正できないのですね。

つまり、MainフォームからB画面のテキストボックスを参照できればいいのですね。
となると、非公開メンバへアクセスすることになりますので
リフレクション機能を使うしかないです。

リフレクションの使い方については、MSDN等を参考にしてください。
(説明しだすと長くなりそうなので、申し訳ないですが。)

それでまた疑問点が出ましたら、再度質問してみては如何でしょう。

【追加】
読み直して疑問に思ったのですが、
B画面のDLLを修正することは、無理なのですよね?

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-01-18 14:16 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-01-18 15:24
ご参考

http://blogs.wankuma.com/jitta/articles/54305.aspx

ディレクトリによる分類にも、マルチフォームがあります。
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-18 18:32
くまっち様


≫B画面のDLLを修正することは、無理なのですよね?


無理ではありません。
共通でうまく使えるように修正することはもちろん可能です。


くまっちさんのおっしゃるようにリフレクションを検索し、私なりにいろいろと試してみましたがうまくいきませんでした。。。
初心者でちゃんと理解できていないので、無茶苦茶かもしれませんが・・・


Mainフォームに下記のようなコードを書いてみました。

Dim frm As New B画面.B画面_Form

frm.GetType.InvokeMember("setcd", Reflection.BindingFlags.InvokeMethod, Nothing, frm, New Object() {"A"})


B画面には下記のようなメソッドを下記、ページロードで呼び出すようにしました。

Public Sub setcd(ByVal code As System.String)

TextCD.Text = code

End Sub


しかしbankcodeはNothingでした。。。

間違っていますか??

本当は単純に画面BでPublic変数を宣言し、それをMainフォームでリフレクションを使用して値を代入したいのですがこれも失敗してしまいました。
やり方がまずそうなのですが、色々調べてもわかりませんでした。

申し訳ないですがどこがおかしいか教えていただけませんか??

よろしくお願いいたします。


[ メッセージ編集済み 編集者: ふらわー 編集日時 2008-01-18 18:34 ]

[ メッセージ編集済み 編集者: ふらわー 編集日時 2008-01-18 18:35 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-18 18:55
引用:

ふらわーさんの書き込み (2008-01-18 18:32) より:

しかしbankcodeはNothingでした。。。


bankcode? TextCD.Text のことを指しているのでしょうか? だとすると、

引用:

Dim frm As New B画面.B画面_Form

frm.GetType.InvokeMember("setcd", Reflection.BindingFlags.InvokeMethod, Nothing, frm, New Object() {"A"})


しっかりとは見ていませんが、Form のインスタンスと値の設定をしようと InvokeMethod している Form のインスタンスが同一でないだけなのではないでしょうか?

確認するためのコードがこれだけであれば、その可能性はあります。 ということで差し支えなければ 「確認方法」 を教えてください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-01-18 23:38
私がすごく勘違いしている気がするので、一度確認いたします。

[DLL側]
A画面を呼び出すコンポーネント
B画面を呼び出すコンポーネント
A画面
B画面

[Mainフォーム側]
Mainフォーム

で、、、MainフォームのA,B各ボタンは
DLLのコンポーネントクラスを設定。

以上の構成で合ってますかね?

そしてDLL側は汎用的に使える構成である必要があるのですよね?

スキルアップ/キャリアアップ(JOB@IT)