Pregunta

Estoy buscando actualizar Form1 cuando el formulario 2 está cerrado. Sé usar un evento de cierre de Form2, pero ahí es donde me pierdo.

Gracias

¿Fue útil?

Solución

Una buena manera de lograr esto es usar el patrón de mediador. De esta manera, sus formularios no tienen que conocerse necesariamente el uno del otro. Permita que el mediador administre la interacción entre las formas para que cada forma individual pueda concentrarse en sus propias responsabilidades.

Un mediador muy crudo que lograría lo que desea podría implementarse así:

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

Ahora su submarino se actualizará cuando el formulario principal esté cerrado, y ninguno tiene que saber nada sobre el otro.

EDITAR:

Ok, voy a publicar esta solución que lo hará comenzar, pero tenga en cuenta que esto es solo una implementación rudimentaria de un patrón de mediador. Te recomiendo que leas sobre ese patrón y los patrones de diseño en general para obtener una mejor comprensión de lo que está sucediendo.

Nuevamente, esta es una muestra, pero tiene una verificación de errores básicos y debería ponerlo en marcha.

Su declaración de formulario se verá algo así:

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

Y la implementación modificada del mediador se vería así:

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

Otros consejos

Una solución es pasar una referencia de Form1 a Form2 en el constructor y simplemente llamar a F1.invalidato (verdadero) en el evento de cierre de Form2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top