Domanda

Sto cercando di aggiornare form1 quando la forma 2 è chiusa. So di usare un Evento di chiusura da form2, ma dove mi perdo.

Grazie

È stato utile?

Soluzione

Un buon modo per raggiungere questo obiettivo è quello di utilizzare il modello di mediatore. In questo modo i moduli non devono conoscere necessariamente gli uni degli altri. Lasciare che il mediatore per gestire l'interazione tra le forme in modo che ogni singola forma può concentrarsi sulle proprie responsabilità.

Un mediatore molto grezzo che potrebbe ottenere quello che vuoi potrebbe essere implementato in questo modo:

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();
    }
}

Ora la vostra forma secondaria aggiornerà ogni volta che il modulo principale è chiusa, e nessuno dei due ha sapere nulla gli uni degli altri.

Modifica

Ok, così ho intenzione di mettere questa soluzione che vi consentiranno di iniziare, ma si prega di notare che questa è solo una rudimentale implementazione di un modello di mediatore. Altamente vi incoraggio a leggere su quel modello, e modelli di progettazione, in generale, al fine di ottenere una migliore comprensione di ciò che sta accadendo.

Ancora una volta, questo è un campione, ma ha il controllo alcuni errori di base e dovrebbe farti andare.

Il modulo di dichiarazione è andare a guardare qualcosa di simile:

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 l'attuazione modificata del mediatore sarebbe simile a questa:

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);
        }
    }
}

Altri suggerimenti

Una soluzione è quella di passare un riferimento di Form1 Form2 nel costruttore e chiamare f1.Invalidate (true) in caso di Form2 chiusura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top