2017-02-08 13 views
2

私は新しい.Net Winformsですが、私は一般的にコンソールアプリケーションまたはMVCのいずれかで動作します。.Net Winformsはすべての開いているウィンドウに通知します

MDI WinFormsアプリケーションを開発していて、1つのウィンドウで変更を加えた場合、変更されたMDIフォームを更新する必要があります。

どうすれば実現できますか?以前のDelphi(v3)では、WM_USERタイプのメッセージを「公開」していましたが、各フォームには必要なアクションをとる「サブスクライバハンドラ」があります。長い間前。

すべてのフォームがデータのわずかな変化であり、一つの形の変化が他のデータに影響を与えることができます。..

TYIA

+0

すべてのフォームが同じタイプですか(そうであれば、ここから参照できます:http://stackoverflow.com/questions/4646705/how-can-i-loop-through-all-the-open-特定のインスタンスとhttps://msdn.microsoft.com/en-us/library/system.windows.forms.application.openforms(v=vs.110).aspx)のインスタンス?これを使用すると、開いているすべてのフォームをループすることができ、Refresh()メソッドを呼び出すことができます(公開として宣言します)。 –

+0

いいえ、フォームは同じフォームの複数のインスタンスではありませんが、それらはすべてわずかに異なりますが、原理的には動作します...理想的には..変更されたデータの__type__を使用するとフォームをリフレッシュしたいだけです例えばどのような従業員データを表示しているすべてのフォーム) –

+2

MDI親フォームにイベントを追加すると、すべての子がそれをサブスクライブすることができます。 –

答えて

1

あなたは次のように達成することができ、子供と親の間でイベントシステム、必要:フォーム上の任意のデータが変更されたときに発生するイベントが含まれているあなたの子フォームの基本クラスを作成します

  • を。 FormChangedイベントとしましょう。
  • イベントを親フォームに追加して、すべての子に通知します。 ChildFormChangedイベントとしましょう。
  • 各子フォームのインスタンス化時に、親フォームが子のFormChangedイベントを購読し、新しい子フォームに親フォームのChildFormChangedイベントをサブスクライブするようにします。
  • 親フォームのFormChangedイベントのイベントハンドラはパススルー機能に過ぎず、ChildFormChangedイベントを発生させ、子フォームから受信した情報を渡してイベントを発生させます。
  • ChildFormChangedイベントは、(各子フォームの詳細を処理するために)各子クラスでオーバーライドできる仮想イベントハンドラ(汎用アイテムを処理するため)を介して子フォームの基本クラスで処理できます。

私はC#とposted it on Githubのサンプルアプリケーションを書き、コメントしました。

ベースの子フォーム::

public event EventHandler<EventArgs> FormChanged; 

    public virtual void ProcessChange(object sender, EventArgs e) 
    { 
     if((sender as Form) != this) 
     { 
      //Handle change 
     } 
    } 

    protected void NotifyParent() => FormChanged?.Invoke(this, EventArgs.Empty); 

親フォーム:ここでは、関連するコードがあります任意の変更は、あなたが他の子フォームに伝播することを発生したら

public event EventHandler ChildFormChanged; 

    public void NotifyAllChildren(object sender, EventArgs e) 
     => ChildFormChanged?.Invoke(sender, e); 

    //Child form creation function 
    private void createNewFormToolStripMenuItem_Click(object sender, EventArgs e) 
    { 

     MDIChildBase newChild = new MDIChild(); //Can be different child forms 
     newChild.MdiParent = this; 

     //Parent-child event subscription 
     newChild.FormChanged += NotifyAllChildren; 
     ChildFormChanged += newChild.ProcessChange; 

     newChild.Show(); 
    } 

すべての子フォームはbase.NotifyParent();を呼び出す必要があります。

+0

私はEventArgs(またはカスタムイベント)に情報を追加して、変更の種類(従業員/株)を指定してから、子フォームで適切に反応させることができると推測しています –

+0

@ChrisHammond、絶対に、多くの読者がこのデリゲートに精通しているので、私は 'EventHandler'を使用してサンプルを素早く読みやすくしました。 – CoolBots

1

あなたはまだ、Windowsのメッセージングインフラストラクチャを使用することができます。説明されたhereおよびhere

+1

それを持つスレハマーのビット...もう少しシームレスなものがあるかもしれないと思った。 –

関連する問題