C# WinForms の領域でコーディングを行っている間、フォーム間でデータを渡すさまざまな方法に出くわしたことが何度もありました。私は大規模なコードベースに取り組んでいます。これらのメソッドのいくつかは他の人によって書かれ、後でそれを拡張し、他のメソッドは自分で書いたものです。2 つの主要なパラダイムがあるようですが、どちらもかなり快適にコーディングできました。
1.) 子フォームをインスタンス化または表示するときに、親フォームを子に渡します。例えば:
ChildForm.Instance = new ChildForm(this);
--Or--
ChildForm.Instance = new ChildForm();
ChildForm.Instance.Show(this.TopLevelControl);
これにより、子は親から情報を取得できるようになり、親は子のメソッドを呼び出すことができます。ちょっと待ってください - これは非常に多くのパラダイムを壊し、「悪い」習慣であることを認識しています - 覚えておいてください、私は段階的な調整を行う必要がある大規模なコードベースのメンテナンス中に、この多くに遭遇しています完全なリファクタリングを行わずに。
2.) イベント デリゲートを使用して、親フォームと子フォームの間でデータを転送できるようにします。私の知る限り、これには、子を生成するときに親フォームがこのイベントを確立する必要があります。例えば:
親内:
childForm = new ChildForm(this);
DataRead += new DataReadEventHandler(childForm.ChildForm_DataRead);
子内:
public void ChildForm_DataRead(Data data)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(delegate() { ChildForm_DataRead(data); }));
}
else
//do something
}
この性質の何か。現在、私はまだ C# WinForms の強力なコーダーではありませんが、イベント/メッセージング アプローチが設計の観点からおそらく「優れている」ことを認識しています。
さて、ここで私の質問です。
命名のために、メインフォームがあります:ParentForm。ParentForm は現在、メッセージングの後者の形式 (har har!) を使用して、データを FirstChildForm に渡します。基本的に、ParentForm がデータを取得すると、DataReadEventHandler がトリガーされ、ParentForm から FirstChildForm にデータが渡されます。
問題ない。
現在、/また/、ParentForm から作成された、SecondChildForm というフォームがあります。注意: これは ChildForm の別のインスタンスではありません... まったく別のフォームです。これが問題です。SecondChildForm でデータが更新されるときに、このデータを FirstChildForm に渡したいのです。とても単純なアイデアのように思えますが、実装方法に頭を悩ませています。私が考えることができるのは、子ごとに ParentForm から一意のイベント ハンドラーを設定し、SecondChildFrom からのイベント ハンドラーを持ってから、FirstChildForm の ParentForm のイベント ハンドラーをトリガーすることだけです...これは、データ (自明でないサイズの、私は追加される可能性があります)、最初に SecondChildForm から ParentForm に渡され、次に ParentForm から FirstChildForm に渡される必要があります。
これを行うより良い方法はありますか?
また、私は本当にこれを言いたくないのですが、完全に正直に言うと、この非常に閉じたアプリケーションでは、適切な方法が非常に複雑である場合、単純化のためにパラダイムを壊しても問題ありません (それでも将来的に時間を割り当てるでしょう)適切なリファクタリング -- はい、私は実際に/am/これを行うことができます!)。
乾杯!
-カダージュ