form2を閉じるときにform1を更新するにはどうすればよいですか

StackOverflow https://stackoverflow.com/questions/930845

  •  06-09-2019
  •  | 
  •  

質問

Form 2が閉じているときにForm1を更新しようとしています。 Form2の閉鎖イベントを使用することは知っていますが、それは私が迷子になる場所です。

ありがとう

役に立ちましたか?

解決

これを達成する良い方法は、メディエーターパターンを使用することです。このようにして、あなたのフォームは必ずしもお互いを知る必要はありません。メディエーターがフォーム間の相互作用を管理できるようにして、個々のフォームが独自の責任に集中できるようにします。

あなたが望むものを達成する非常に粗い調停者は、そうするように実装することができます:

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();
    }
}

これで、メインフォームが閉じられるたびにサブフォームが更新され、お互いについて何も知る必要はありません。

編集:

わかりました、だから私はあなたが始めるようになるこのソリューションを出力するつもりですが、これはメディエーターパターンの初歩的な実装にすぎないことに注意してください。何が起こっているのかをよりよく理解するために、そのパターンとデザインパターンについて読んでみることを強くお勧めします。

繰り返しますが、これはサンプルですが、基本的なエラーチェックがあり、進む必要があります。

あなたのフォーム宣言は次のようになります:

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);
        }
    }
}

他のヒント

1つの解決策は、Form1の参照をコンストラクター内のForm2に渡し、FORM2の閉鎖イベントでF1.Invalidate(true)を呼び出すことです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top