Como posso obter o formulário 1 para atualizar quando fechar o formulário2

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

  •  06-09-2019
  •  | 
  •  

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top