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