Как я могу получить form1 для обновления при закрытии form2 - PullRequest
3 голосов
/ 31 мая 2009

Я хочу обновить форму 1, когда форма 2 закрыта. Я знаю, как использовать закрывающее событие из form2, но там я заблудился

Спасибо

Ответы [ 2 ]

4 голосов
/ 31 мая 2009

Хороший способ добиться этого - использовать шаблон «Посредник». Таким образом, ваши формы не обязательно должны знать друг о друге. Разрешить посреднику управлять взаимодействием между формами, чтобы каждая отдельная форма могла сосредоточиться на своих обязанностях.

Очень грубый посредник, который достиг бы того, чего вы хотите, мог бы быть реализован так:

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);
        }
    }
}
2 голосов
/ 31 мая 2009

Одно из решений - передать ссылку Form1 в Form2 в конструкторе и просто вызвать f1.Invalidate (true) в случае закрытия формы 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...