2016-05-09 5 views
1

モジュール式/ドッキング可能なサブフォーム(WeifenLuo)を持つWinFormがあります。フォーム間でイベント/情報を渡すベストプラクティスは何ですか?C#イベントの配布

例:SubForm1の "SelectionChanged"イベントで、SubForm2で強調表示されているものを変更します。問題は、SubForm2-Tabが1つまたは複数存在する可能性があります。サブフォームの新しいインスタンスがユーザによって要求された場合

現在、このような関数が呼び出されます。

private void toolStripMenuItemSubForm1_Click(object sender, EventArgs e) 
    { 
     SubForm1 subForm1 = new SubForm1(); 
     subForm1.Show(dockPanelMain, DockState.Document); 
    } 

のMainFormはdockPanelMain.Contentsを除くすべてのサブフォームのレコードがありません。

編集:フォームが相互にやりとりする方法や、イベント自体がどのように機能するかを知っています。私の問題は、SubForm1のイベントが異なる他のSubFormsを変更する可能性がありますが、特定の時点で存在しない場合や、複数のインスタンスが存在する可能性があり、単一のイベントごとにMainFormを通じてチェーンしたくない場合です。

+0

[C#で2つのウィンドウフォーム間で通信する]の可能な複製(http://stackoverflow.com/questions/1665533/communicate-between-two-windows-forms-in-c-sharp) –

+0

イベントを追加して立ち上がりそれ。誰か(別のフォーム)は、それを購読/購読解除して何かをするかもしれません。 – Sinatr

+1

これは本当に広すぎです...しかしここに私の2セントはありますが、グローバルイベントハブはどうですか?イベントを受け取る必要があるフォームを作成するときにグローバルハブがある場合、それをサブスクライブする必要があります。清潔でシンプル。 – Gusman

答えて

3

IMHO、あなたは間違った方法の周り

私をこのようにこの種の問題を提示するために使用教師を、これを取っている:「最高経営責任者(CEO)は、必ずしも彼のために働くすべての人を知らないしかし、すべての労働者がします。それはこれが同様にあなたの問題に適用することができCEO」(それは(急いで)翻訳されています、フレージングは​​ご容赦)

知っている:

このインスタンスに保持する責任を持つことになります子供に親インスタンスを渡します彼らが聴いているはずの出来事に潜んでいる。

この方法で、あなたの親クラスがイベントのみを上げるの世話をする必要がありますが、子供は自分自身を更新する作業を行います

EDIT:

が、それはだdockpanelのコンテンツクラスの間で動作するように基本的に同じこと。

ドックパネルのContentsプロパティを子クラスに渡します。 これはコレクション(したがって参照型)なので、子クラスは常に最新のコレクションの 'バージョン'にアクセスできます。

あなたは(私は最後にキャストを見逃している場合があります)このコレクションに

フィルタリングの例をフィルタリングすることにより、あなたのために関心のあるすべてのインスタンスを取得するにはちょうど必要があります:

IEnumerable<SubForm2> sf2 = dockContents.Where(sf => sf is SubForm2) 
+0

私はそれを次のような問題としてもっと見る(0-n)と仲介人としてのCEOの介入なしに対話する。 – thetemplar

+0

私はコンセプトが好きです。余分なクラスやディストリビューターの必要はありません。 foreach-existing-contentループと 'dockPanelMain.Contents.ContentAdded'イベントをコンストラクタに追加しました。 うまく動作するはずですが、後でちょっと肥大化するかもしれません。 – thetemplar

+0

@thetemplarこれは、これらのインスタンスがすべて共通のヘラキーに属している場合にのみ可能です。彼らがしなければ、あなたの唯一の解決策は、GusmanのAFAIK – Sidewinder94

0

私はSubformコンストラクタにイベント/デリゲートを含むEventクラスを渡すことをお勧めします。各サブフォームは、適切な時間に発生したイベントにサブスクライブすることができます。