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

画面間情報

環境/言語:[WindowsXP]
分類:[.NET]

初めまして。質問をさせて下さい。

今フォームとフォームの画面遷移時に、遷移元の情報を遷移先に渡したいのですが、渡す良い方法が見つからずに悩んでいます。

渡す情報としては、遷移元のフォームのインスタンス、フォーム名、必要に応じて画面での情報(例えばテキストボックスの入力値)等を渡したいと思ってます。

ただ、イメージとしては、画面間の情報を渡したり、設定したりするクラスがあれば良いかな?と思ってます。

個人的に勉強の為に作っているので、余りにも初心的な質問ではあると思いますが、どうかご指導して頂けたらと思っております。

宜しくお願い致します。
  • 題名: Re[1]: 画面間情報
  • 著者: YAS
  • 日時: 2006/07/04 22:14:28
  • ID: 16452
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
フォームはモーダルですか?モードレスですか?
モーダルならフォームのコンストラクタで値を渡してしまうのが簡単かと思います。

いずれにせよ,フォーム間の値のやり取りは,かなり繰り返し質問されていることなので,少し調べればたくさん出てくると思います。
2006/07/05(Wed) 10:50:40 編集(投稿者)

お世話になります。

■No16450に返信(けいとさんの記事)
ちょっと気になったのですが...。
> 渡す情報としては、遷移元のフォームのインスタンス、フォーム名、必要に応じて画面での情報(例えばテキストボックスの入力値)等を渡したいと思ってます。
> 画面での情報(例えばテキストボックスの入力値)等
を渡すのであれば、
> 遷移元のフォームのインスタンス、フォーム名
って必要なんでしょうか。

YAS さんがかかれているとおり、モーダルかモードレスによっても
違ってくる部分もありますが...。
■No16455に返信(なおこ(・∀・)さんの記事)
>> 画面での情報(例えばテキストボックスの入力値)等
>を渡すのであれば、
>> 遷移元のフォームのインスタンス、フォーム名
>って必要なんでしょうか。
補足しますが、一般的に
 遷移元→親フォーム
 遷移先→子フォーム
といった解釈をしますが、子フォームは親フォームの参照アドレス
を持っていれば、確かに親フォームを操作できます。ただし、
親子関係が崩れるため、悪い設計とされています。

オブジェクト指向プログラミングの『カプセル化』あたりについても
学んでみてはどうでしょうか。
http://www.atmarkit.co.jp/fjava/devs/object02/object02.html
外部にインスタンスを公開する時点で問題となります。
受け渡しの基本ということなら、カスタム(独自)プロパティの実装からはじめたらどうでしょうか。

Public Class MyParentForm

Private Sub ShowMyChildForm()

Dim ChildForm As New MyChildForm

With ChildForm
.MyProp1 = "渡したい情報"
.Show()
End With

End Sub

End Class

Public Class MyChildForm

'この変数で処理を書く
Private _MyProp1 As String
Public Property MyProp1() As String
Get
Return _MyProp1
End Get
Set(ByVal value As String)
_MyProp1 = value
End Set
End Property

End Class
皆様丁寧に本当に有り難う御座います。

説明不足もありますので改めて説明させて頂きます。

まず画面遷移を提供するクラスと画面情報(親フォーム、子フォーム等)を管理するクラスを作りました。画面遷移クラスには画面情報クラスを参照するフィールドを作成致しました。

そして基底フォームのプロパティに画面遷移クラスを参照するプロパティを作成致しました。

そして遷移ボタンと言う物があり、遷移先のフォームIDを設定するプロパティを作成しました。

遷移ボタンをクリックすると、フォームIDをキーにして遷移先情報を記述しているXmlファイルよりアセンブリとクラス名を取得し、リフレクションを使用して遷移先のインスタンスを生成させてます。

この遷移先フォームのインスタンスを生成後に遷移先フォームをShowし、その後に遷移先フォームの画面遷移プロパティに親フォームのインスタンス、子フォームのインスタンスを設定しております。
生成後には、トップフォーム以外はCloseさせてます。

問題は、遷移先フォームに配置している戻るボタンクリック時です。

単純に戻るボタンをクリックしたときに、遷移元のフォームをプロパティを使用しShowをさせようとすると、「破棄されたオブジェクトです」とエラーになってしまい、根本的に画面情報の扱いがいけないのかと悩んでおりました。そして書き込みをさせていただいた次第です。

この戻るボタンクリック時に、遷移元のフォームをまたリフレクションを使用しインスタンスを生成すれば可能かと思っているのですが、可能であればインスタンスをそのまま使用出来ればなと思ってます。

まず、クラス設計に間違いがあると思います。色々悩んでいるのですが、携帯でのネット検索しか出来ない環境で、ここの掲示板に書き込みをさせて頂きました。

どうか良い実装方法や良く使われる実装方法等ありましたら御教授お願いいたします。

誤字脱字で理解しがたい箇所もあるとは思いますが、宜しくお願いします。
  • 題名: Re[5]: 画面間情報
  • 著者: けいと
  • 日時: 2006/07/05 21:05:38
  • ID: 16471
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
すみません訂正させて頂きます。


> 単純に戻るボタンをクリックしたときに、遷移元のフォームをプロパティを

では無く、自身のプロパティの画面遷移より子フォームのインスタンスを使用してShowです。
根本的な質問だと思っていたのだけど違うようですね。。。

> この戻るボタンクリック時に、遷移元のフォームをまたリフレクションを使用しインスタンスを生成すれば可能かと思っているのですが、可能であればインスタンスをそのまま使用出来ればなと思ってます。

複数のオブジェクトが双方向で参照してはいけません。
クラスは自分の外の世界を知らないし考えてはいけません。

そのことからいくと、フォームは自分を閉じるだけにしなくてはいけません。
で、呼び出し元を知らないわけですから、イベントや呼び出し元がモーダル表示するなどで
呼び出し元が、呼び出し先が閉じた旨を認識できる手段を用意してあげます。

A→B→C として、
AはBを知っている、BはCを知っているがAを知らない、Cは・・・
有り難う御座います。やはり考えていた方法は良くないようですね…。

オブジェクト指向の考え方からも外れているようですし、もう一度設計しなおしてみようと思ってますが、.Netもまだ日が浅く、いまいちどうしていくのが良いか分からないです…。

お聞きしたいのですが、
> 呼び出し元が、呼び出し先が閉じた旨を認識できる手段を用意してあげます。
とは具体的にどの様な実装のしかたでしょうか?
■No16478に返信(けいとさんの記事)
> お聞きしたいのですが、
>>呼び出し元が、呼び出し先が閉じた旨を認識できる手段を用意してあげます。
> とは具体的にどの様な実装のしかたでしょうか?

ShowDialogなら苦もなく可能なんですけどね。
Showにする必要があるかわかりませんが、Showならイベント通知とかになるかな。
お返事有難う御座います。
実際には画面丈には1つの画面のみを表示させたいと言う考えがあるのですが、自分の認識としては、ShowDialogは前画面を操作出来ない、Showは操作できる、といった認識でいます。

> ShowDialogなら苦もなく可能なんですけどね。
> Showにする必要があるかわかりませんが、Showならイベント通知とかになるかな。

苦も無く可能と言う事と、イベント通知になると言うことの詳細を教えて頂けないでしょうか?
  • 題名: Re[8]: 画面間情報
  • 著者: まどか
  • 日時: 2006/07/06 9:28:59
  • ID: 16482
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
> >>呼び出し元が、呼び出し先が閉じた旨を認識できる手段を用意してあげます。
>>とは具体的にどの様な実装のしかたでしょうか?
>
> ShowDialogなら苦もなく可能なんですけどね。
> Showにする必要があるかわかりませんが、Showならイベント通知とかになるかな。

そうですね。
インスタンスを保持したいということは前のフォームをそのまま取っておきたいということでしょうから
常に最後に表示したフォームのみが有効であればモーダルですんなりいきますね。
閉じた理由などをカスタムプロパティとして実装するくらいでしょう。

モードレスで自分を呼び出したインスタンスへ制御を戻すということになれば
表示した側がインスタンスを管理して、かつ、非同期で表示先のCloseを監視することになりますね。
やっぱり一番簡単なのはイベント通知でしょうか。

いずれにしろ、閉じるフォームは閉じるだけで、表示元を意識することはありません。

#よく業務でどこから来たかによりフォーム内の機能を切り替える仕様に出くわしますが
#それについても呼び出し側が機能を指定するようにするべきですね。
  • 題名: Re[9]: 画面間情報
  • 著者: 特攻隊長まるるう
  • 日時: 2006/07/06 9:34:33
  • ID: 16483
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
携帯で見れるのか分かりませんが。。。
http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200606/06060011.txt
親クラス(Class1)が子クラス(全てのフォーム)を管理し、イベントで制御するサンプル。
参考になればどうぞ。

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