1

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/これを行うことができます!)。

乾杯!

-カダージュ

4

1 に答える 1

3

したがって、データは最初に 2 番目の子で生成されるため、そのフォームでは、そのデータを提供できるトリガー可能なイベントが必要になります。

public class SecondChildForm : Form
{
    public event Action<MyData> SomethingHappened;

    //Other code, including code that fires the event at some point
}

次に、そのデータを渡して呼び出す必要があるメソッドを持つ最初の子があります。

public class FirstChildForm : Form
{
    public void WhenSomethingHappens(MyData data)
    {
        //Do stuff with data
    }
}

最後に、両方のフォームを作成し、適切なイベント ハンドラーを接続するメイン フォームがあります。

public class ParentForm : Form
{
    public ParentForm()
    {
        FirstChildForm firstChild = new FirstChildForm();
        SecondChildForm secondChild = new SecondChildForm();

        secondChild.SomethingHappened += firstChild.WhenSomethingHappens;

        //show forms and do other stuff
    }
}

出来上がり。

このパターンを使用すると、各子は親について何も知らないことに注意してください。イベントを通じて親が必要とする情報を公開し、パブリック メソッドを通じて親が情報に影響を与えることを許可しますが、どのクラスがそれらを使用しているかは知りません。親自分の子の型を知っています。特定の子型のインスタンスを持ち、そのパブリック メンバーを直接操作することが適切です (ただし、パブリックであってはならない内部コントロールは操作しません)。

于 2013-06-11T15:05:32.810 に答える