2009-05-30 17 views

答えて

4

メディエーターパターンを使用するとよいでしょう。このようにして、フォームはお互いを必ずしも知る必要はありません。各フォームがそれぞれの責任に集中できるように、フォーム間の相互作用を管理することをメディエータに許可します。あなたが望むものを達成するであろう

非常に粗製のメディエータはそうように実装することができます

public class FormMediator 
{ 
    public Form MainForm { private get; set; } 
    public Form SubForm { private get; set; } 

    public void InitializeMediator() 
    { 
     MainForm.FormClosed += MainForm_FormClosed; 
    } 

    void MainForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     SubForm.Refresh(); 
    } 
} 

メインフォームが閉じていない、どちらもお互いについて何を知っていなければならない時はいつでも今、あなたのサブフォームが更新されます。

EDIT:

オクラホマので、私はそれから、このソリューションを置くつもりですが、あなたが始めるだろうが、これはMediatorパターンの唯一の初歩的な実装であることに注意してください。どんなことが起こっているのかをより良く理解するためには、そのパターンとデザインパターン全般を読むことを強くお勧めします。

これもまたサンプルですが、いくつかの基本的なエラーチェックが行われています。

フォームの宣言は次のようなものを見に行くされています

public partial class MainForm : Form 
{ 
    private FormMediator _formMediator; 

    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    public void SomeMethodThatOpensTheSubForm() 
    { 
     SubForm subForm = new SubForm(); 

     _formMediator = new FormMediator(this, subForm); 

     subForm.Show(this); 
    } 
} 

をメディエータの変更の実装は次のようになります。

public class FormMediator 
{ 
    private Form _subForm; 
    private Form _mainForm; 

    public FormMediator(Form mainForm, Form subForm) 
    { 
     if (mainForm == null) 
      throw new ArgumentNullException("mainForm"); 

     if (subForm == null) 
      throw new ArgumentNullException("subForm"); 

     _mainForm = mainForm; 
     _subForm = subForm; 

     _subForm.FormClosed += MainForm_FormClosed; 
    } 

    void MainForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     try 
     { 
      _mainForm.Refresh(); 
     } 
     catch(NullReferenceException ex) 
     { 
      throw new InvalidOperationException("Unable to close the Main Form because the FormMediator no longer has a reference to it.", ex); 
     } 
    } 
} 
+0

実際にはデザインパターンです。ジョシュがそれを書いてしまうまで、クラスは存在しませんでした。 :)どのように使用するかに関しては、アプリケーションはそのインスタンスを作成し、そのMainFormとSubFormのプロパティを設定します。 – GalacticCowboy

+0

FWIWでは、フォーム "SubscriberForm"と "SubscribedForm"を実際に呼び出すことができます。サブスクライバは、更新したいサブスクライバであり、サブスクライブは、クローズイベントを取得するサブスクライバです。 – GalacticCowboy

+0

それは素晴らしいジョシュです。それをすべて差し込んで、広告されたとおりに動作します!私は今夜​​新しいことを学びました。ありがとう! – JimDel

2

は一つの解決策は、コンストラクタでのForm2にForm1の参照を渡すだけのForm2のclosingイベントにf1.Invalidate(true)を呼び出すことです。

+0

私はこれを使用するのではなくていませんよ解決策もありますが、初心者としてはコンストラクタを使用したことがありません。だから私はあなたが何を意味するか分からない。 – JimDel

関連する問題