Como posso obter o formulário 1 para atualizar quando fechar o formulário2
Pergunta
Estou procurando atualizar o Form1 quando o Formulário 2 estiver fechado. Eu sei usar um evento de encerramento do Form2, mas é onde me perco.
Obrigado
Solução
Uma boa maneira de conseguir isso é usar o padrão do mediador. Dessa maneira, seus formulários não precisam necessariamente se conhecer. Permita que o mediador gerencie a interação entre os formulários para que cada forma individual possa se concentrar em suas próprias responsabilidades.
Um mediador muito grosseiro que alcançaria o que você deseja pode ser implementado assim:
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();
}
}
Agora, seu sub -formulário será atualizado sempre que o formulário principal estiver fechado, e nenhum dos dois deve saber nada um sobre o outro.
EDITAR:
OK, então vou divulgar esta solução que você começará, mas observe que essa é apenas uma implementação rudimentar de um padrão de mediador. Eu o encorajo a ler sobre esse padrão e projetar padrões em geral, a fim de entender melhor o que está acontecendo.
Novamente, esta é uma amostra, mas tem algumas verificações básicas de erro e deve fazer você ir.
Sua declaração de formulário vai parecer algo assim:
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);
}
}
E a implementação modificada do mediador ficaria assim:
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);
}
}
}
Outras dicas
Uma solução é passar em uma referência do Form1 para o Form2 no construtor e apenas chamar F1.invalidate (true) no evento de encerramento do Form2.