- PR -

フォーム間のデータ渡し

投稿者投稿内容
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-11-13 12:02
vs2005 vb winxp winform

いつも拝見しております。

1つご教授願いたいことがあります。
ております。A→Bを参照)

A画面→B画面を開き、B画面ではグリッドを使った一覧データを表示させています。

行をダブルクリックしたら、そのデータセットと、データの位置をA画面に渡したいのです。
(それをつかって、A画面ではB画面で選択したデータを貼り付ける処理を行っています。貼り付けるレコード場所は任意です)

一度B画面をひらいたら、2画面は両方開いたままで、選択→貼り付けを何度もできるようにしたいのです。

A画面から、B画面にひらく
Imports B画面.frmB画面
Dim frmB画面 As New B画面.frmB画面
B画面.Show()

’B画面→A画面を開くとき
A画面.frmA画面.FormInstance = A画面
A画面.frmA画面.FormInstance.prm_ds = ds
A画面.Show()

と指定して、作成したPUBLICプロパティに値を入れて渡してあげたいなと思ったのですが、循環参照ができません。とおこられてしました。

最初は、同じプロジェクト内で2つの画面が共存していたので動作していたのですが、今は別にすることにしましたのでこの問題にあたりました。

このような場合は、違う方法で渡してあげたりするのでしょうか??

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24335&forum=7
を参考にのですが、違う方法で行ってる方がおりましたら、ご教授お願いいたします。
むさいくろう
常連さん
会議室デビュー日: 2006/11/13
投稿数: 20
お住まい・勤務地: 本田市
投稿日時: 2006-11-13 12:06
中間にあたるクラスを作ってやってそこで値を管理するとか。
その前に、なぜ循環参照だと怒られるのかわかっていますか?
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-11-13 15:49
むさいくろうさん、返答ありがとうございます

引用:

その前に、なぜ循環参照だと怒られるのかわかっていますか?



A画面→B画面 と A画面←B画面を許可してしまうと、それぞれの画面管理がごちゃごちゃして、どちらがどちらを管理してるのかわからなくなってしまうために、怒られてしまうんですよね!?

いろいろ思考錯誤した結果、B画面でパブリックで宣言した、データセットをA画面で、
参照する形をとってみました。

'A画面側 貼り付けボタン押下時
dtTable  = B画面.ds.table(0)

一応これで、値を参照することはできました。

引用:

中間にあたるクラスを作ってやってそこで値を管理するとか



とは、どのような流れになるのでしょうか?
よろしければ、ながれ的なことを教えていただけると助かります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-11-13 16:50
引用:

どらさんの書き込み (2006-11-13 15:49) より:

いろいろ思考錯誤した結果、B画面でパブリックで宣言した、データセットをA画面で、
参照する形をとってみました。

'A画面側 貼り付けボタン押下時
dtTable  = B画面.ds.table(0)


最初に受け渡す側を親と考えると、親が勝手に渡して、親が勝手に回収する。
というのが、構造化言語からの習わしなので、このような実装で良いと思います。
B で DataSet をプロパティとして公開するか、メソッドの戻り値として返すかになります。

引用:

引用:

中間にあたるクラスを作ってやってそこで値を管理するとか


とは、どのような流れになるのでしょうか?
よろしければ、ながれ的なことを教えていただけると助かります。


C というクラスを設け、シングルトンなオブジェクトにして相互に参照可能にしようというものでしょう。
個人的には、回避できるのであれば、回避した方が良いパターンだと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-11-13 17:40
じゃんぬねっとさん、返答ありがとうございます。

引用:

最初に受け渡す側を親と考えると、親が勝手に渡して、親が勝手に回収する。
というのが、構造化言語からの習わしなので、このような実装で良いと思います。
B で DataSet をプロパティとして公開するか、メソッドの戻り値として返すかになります。



他にいいやり方があるのかなっと、他もいろいろ探していましたので、こちらを採用していきたいと思います。

引用:

C というクラスを設け、シングルトンなオブジェクトにして相互に参照可能にしようというものでしょう。
個人的には、回避できるのであれば、回避した方が良いパターンだと思います。



A、B両方からCを参照ってイメージですね。

今一わからなかったところが、理解できました。
B側にプロパティを作ったり、PULIC変数を参照したり、場所場所を考えながら作っていこうと思います。

じゃんぬねっとさん、ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-11-13 22:51
引用:

どらさんの書き込み(2006-11-13 15:49)より:
A画面→B画面 と A画面←B画面を許可してしまうと、それぞれの画面管理がごちゃごちゃして、どちらがどちらを管理してるのかわからなくなってしまうために、怒られてしまうんですよね!?


ゴチャゴチャしているのはその説明...(^-^;

 A Project は B Project に依存しているため、B Project を先にコンパイルしなければならない。B Project は A Project に依存しているため、A Project を先にコンパイルしなければならない。A Project は...

というわけで、「卵が先か、鶏が先か」問題が発生します。管理が云々は人間のことなので、開発環境は知ったこっちゃありません。開発環境自身が困るので、エラーになります。


その他の回答:
 B 画面がイベントを実装し、変更があったときにイベントとして通知する。
A 画面はイベントを監視して、B 画面からデータを取得する。

_________________
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-11-14 10:07
まずはじめに整理しておきます。

引用:

むさいくろう氏

中間にあたるクラスを作ってやってそこで値を管理するとか。


これをパターン化したものに、Mediatorという名前が付けられています。

引用:

Jitta氏

その他の回答:
 B 画面がイベントを実装し、変更があったときにイベントとして通知する。
 A 画面はイベントを監視して、B 画面からデータを取得する。


これをパターン化したものに、Observerという名前が付けられています。

今回のような複数の画面のやり取りを管理する場合において、GOFのデザインパターンからはMediatorとObserverのパターンが適用できる可能性があります。

ただし、どっちを使えばよいかは、適用する場面によって変わります。
これらの適用に関するプロ―チャートをどこかで見たような気がするけど、失念しちゃいました。

代わりに、まさーる氏のサイトを挙げておきます。
http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/dp-ocp-2.html
どら
ベテラン
会議室デビュー日: 2004/08/18
投稿数: 63
投稿日時: 2006-11-14 10:14
Jittaさん、返答ありがとうございます。

引用:

A画面→B画面 と A画面←B画面を許可してしまうと、それぞれの画面管理がごちゃごちゃして、どちらがどちらを管理してるのかわからなくなってしまうために、怒られてしまうんですよね!?

ゴチャゴチャしているのはその説明...(^-^;



わかりにくかったですよね^_^;
コンパイル時に判断ができないから、エラーを発生させているんですね。
完全に理解していなかったので、変な文章になってしまいました。
ありがとうございます。

引用:

その他の回答:
 B 画面がイベントを実装し、変更があったときにイベントとして通知する。
A 画面はイベントを監視して、B 画面からデータを取得する。



というのはA画面側にて、WithEventsでB画面を宣言し
B画面のイベントを監視し、取得するってかんじになるのでしょうか!?
勉強不足のために、また変な文章になってしまっているのかもしれませんが、別フォームのイベント監視をもうちょっと調べてみます。

ありがとうございました。

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