あなたは次のように達成することができ、子供と親の間でイベントシステム、必要:フォーム上の任意のデータが変更されたときに発生するイベントが含まれているあなたの子フォームの基本クラスを作成します
- を。
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();
を呼び出す必要があります。
すべてのフォームが同じタイプですか(そうであれば、ここから参照できます: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()メソッドを呼び出すことができます(公開として宣言します)。 –
いいえ、フォームは同じフォームの複数のインスタンスではありませんが、それらはすべてわずかに異なりますが、原理的には動作します...理想的には..変更されたデータの__type__を使用するとフォームをリフレッシュしたいだけです例えばどのような従業員データを表示しているすべてのフォーム) –
MDI親フォームにイベントを追加すると、すべての子がそれをサブスクライブすることができます。 –