- - PR -
フォーム間のデータ渡し
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 12:06
中間にあたるクラスを作ってやってそこで値を管理するとか。
その前に、なぜ循環参照だと怒られるのかわかっていますか? | ||||||||||||
|
投稿日時: 2006-11-13 15:49
むさいくろうさん、返答ありがとうございます
A画面→B画面 と A画面←B画面を許可してしまうと、それぞれの画面管理がごちゃごちゃして、どちらがどちらを管理してるのかわからなくなってしまうために、怒られてしまうんですよね!? いろいろ思考錯誤した結果、B画面でパブリックで宣言した、データセットをA画面で、 参照する形をとってみました。 'A画面側 貼り付けボタン押下時 dtTable = B画面.ds.table(0) 一応これで、値を参照することはできました。
とは、どのような流れになるのでしょうか? よろしければ、ながれ的なことを教えていただけると助かります。 | ||||||||||||
|
投稿日時: 2006-11-13 16:50
最初に受け渡す側を親と考えると、親が勝手に渡して、親が勝手に回収する。 というのが、構造化言語からの習わしなので、このような実装で良いと思います。 B で DataSet をプロパティとして公開するか、メソッドの戻り値として返すかになります。
C というクラスを設け、シングルトンなオブジェクトにして相互に参照可能にしようというものでしょう。 個人的には、回避できるのであれば、回避した方が良いパターンだと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-11-13 17:40
じゃんぬねっとさん、返答ありがとうございます。
他にいいやり方があるのかなっと、他もいろいろ探していましたので、こちらを採用していきたいと思います。
A、B両方からCを参照ってイメージですね。 今一わからなかったところが、理解できました。 B側にプロパティを作ったり、PULIC変数を参照したり、場所場所を考えながら作っていこうと思います。 じゃんぬねっとさん、ありがとうございました。 | ||||||||||||
|
投稿日時: 2006-11-13 22:51
ゴチャゴチャしているのはその説明...(^-^; A Project は B Project に依存しているため、B Project を先にコンパイルしなければならない。B Project は A Project に依存しているため、A Project を先にコンパイルしなければならない。A Project は... というわけで、「卵が先か、鶏が先か」問題が発生します。管理が云々は人間のことなので、開発環境は知ったこっちゃありません。開発環境自身が困るので、エラーになります。 その他の回答: B 画面がイベントを実装し、変更があったときにイベントとして通知する。 A 画面はイベントを監視して、B 画面からデータを取得する。 _________________ | ||||||||||||
|
投稿日時: 2006-11-14 10:07
まずはじめに整理しておきます。
これをパターン化したものに、Mediatorという名前が付けられています。
これをパターン化したものに、Observerという名前が付けられています。 今回のような複数の画面のやり取りを管理する場合において、GOFのデザインパターンからはMediatorとObserverのパターンが適用できる可能性があります。 ただし、どっちを使えばよいかは、適用する場面によって変わります。 これらの適用に関するプロ―チャートをどこかで見たような気がするけど、失念しちゃいました。 代わりに、まさーる氏のサイトを挙げておきます。 http://www.morijp.com/masarl/homepage3.nifty.com/masarl/article/dp-ocp-2.html | ||||||||||||
|
投稿日時: 2006-11-14 10:14
Jittaさん、返答ありがとうございます。
わかりにくかったですよね^_^; コンパイル時に判断ができないから、エラーを発生させているんですね。 完全に理解していなかったので、変な文章になってしまいました。 ありがとうございます。
というのはA画面側にて、WithEventsでB画面を宣言し B画面のイベントを監視し、取得するってかんじになるのでしょうか!? 勉強不足のために、また変な文章になってしまっているのかもしれませんが、別フォームのイベント監視をもうちょっと調べてみます。 ありがとうございました。 |