Как я могу получить Form1, чтобы обновить, когда я закрываю форму2

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

  •  06-09-2019
  •  | 
  •  

Вопрос

Я хочу обновить Form1, когда форма 2 закрыта. Я знаю, чтобы использовать закрытое мероприятие от 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);
        }
    }
}

Другие советы

Одним из решений состоит в том, чтобы передать ссылку Form1 на Form2 в конструкторе и просто вызовать f1.invalidate (true) на заключительное событие Form2.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top