- PR -

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

投稿者投稿内容
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-21 10:51
じゃんぬねっと様

返信が遅くなり、申し訳ありません。


引用:
--------------------------------------------------------------------------------

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

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

申し訳ないです。間違いです。


正しくはB画面用DLL内のメソッドでの

Public Sub setcd(ByVal code As System.String)

TextCD.Text = code

End Sub

の上記2行目の「code」に値が入っていないということです。
私の予想ではここに値が入ってくるのかなと思っていたので。。。

Mainフォーム内をステップ実行で見ていくと、下記のB画面の「code」にデータを入れたいと思っているところ


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

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


ここはエラーもなく通っているのですが、値が入っていっていません。
ここが悪いのはわかるのですが、どうしたらいいのかさっぱりわかりません。。。

こんなに難しいことをしなくても、もっと簡単にできる方法があればそれを取り入れたいのですが、調べ方が悪いのかもしれませんがわかりませんでした。

何かいい方法はありませんでしょうか??

じゃんぬねっと様にはもう一つの方でも大変お世話になっていて、お手数をおかけしています。。。すいません。
ふらわー
常連さん
会議室デビュー日: 2008/01/11
投稿数: 33
投稿日時: 2008-01-21 10:58
くまっち様

返信が遅くなり、申し訳ありません。

私の説明の仕方が悪いのかもしれません。


引用:
--------------------------------------------------------------------------------


私がすごく勘違いしている気がするので、一度確認いたします。

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

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

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

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

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

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

だいたいあっているのですが、ちょっと補足です。
もしかしたらこの部分だけは勘違いがあるかもしれません。

DLLは2つで
・A画面を含んだA画面用処理コンポーネントがひとつ(Aコンポーネント)
・B画面を含んだB画面用処理コンポーネントがひとつ(Bコンポーネント)
です。

それをMainフォームのAボタンにAコンポーネントを設定し、BボタンにBコンポーネントを設定しています。

初心者でうまく伝えられませんが、伝わりましたでしょうか?

それでくまっち様に教えていただいた、リフレクションというやり方を自分なりに考えて使ってみましたがうまくいきませんでした。

この構成だとうまくいかないのですかね??
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-01-21 13:32
> 返信が遅くなり、申し訳ありません。
いえいえ、週末でしたし気にすることないですよ。

> DLLは2つで
はい、構成は把握できました。ありがとうございます。

で、私がリフレクションを使う方法を提示した理由は
「DLL側の修正が不可能な場合」ですので
DLL側の修正が可能でしたら、私が最初に提示した方法で十分対応可能です。
同一ソリューションで有る必要が有るとかは関係ないです。

下記に1例として私的修正コードを記載いたします。

B画面ソース
コード:

Public ReadOnly Property SET_CD() As String
Set(ByVal Value As String)
Me.TextBox.Text= Value
End Set
End Property



B画面用コンポーネント
コード:

Private refTextBox as TextBox

Public ReadOnly Property REF_TEXT_BOX() As TextBox
Set(ByVal txtObj As TextBox)
Me.refTextBox = txtObj
End Set
End Property

Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
'B画面生成
Dim frm As New B画面.B画面_Form

'コンポーネントが参照するTextBox値をB画面に渡す
frm.SET_CD = Me.refTextBox.Text

'画面表示
frm.ShowDialog()

'検索結果を格納
Me.GET_CD = frm.GET_CD 'コード格納

MyBase.OnClick(e)
End Sub



Mainフォーム
コード:

Page_LoadやInitにて・・・以下コードを記述
Me.BtnB.REF_TEXT_BOX = Me.TextBoxA



以上です。

上記修正を簡単に説明しますと
・Mainフォームの初期時にBtnBに対して、参照するTextBoxを教えておきます。
・BtnBが押下され、OnClickが発生すると、B画面を生成しB画面に参照するTextBox値を設定します。
・B画面を表示します(ShowDialog)

B画面からの値取得が出来ているのですから、
その逆を行えば良いだけですよ。

[追記]
DLLの依存部分は、Bコンポーネントには参照するTextBoxが必要なだけとなります。
もしこれでも依存度が高いのであれば、
BコンポーネントはStringを持つようにして
MainフォームのTextBoxの値が変化する度に、Bコンポーネントに値設定するようにすれば良いと思います。

あと、必要最低限のコードですので、上記サンプルを使用するのであれば
Nullチェックなど、適切に追加してください。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-01-21 13:36 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-01-21 21:51
引用:

くまっちさんの書き込み (2008-01-21 13:32) より:
DLLの依存部分は、Bコンポーネントには参照するTextBoxが必要なだけとなります。
もしこれでも依存度が高いのであれば、
BコンポーネントはStringを持つようにして
MainフォームのTextBoxの値が変化する度に、Bコンポーネントに値設定するようにすれば良いと思います。


 B フォームにイベントを定義する。
 Main フォームでは、B コンポーネントのイベントをハンドリングする。

 なんなら、「通知を行うフォーム」を定義して、A, B フォームはこの「通知を行うフォーム」を継承して作る(あるいはインターフェイスを定義して、実装する)。

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