Wie kann ich form1 dazu bringen, sich zu aktualisieren, wenn ich form2 schließe?

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

  •  06-09-2019
  •  | 
  •  

Frage

Ich möchte Formular 1 aktualisieren, wenn Formular 2 geschlossen ist.Ich weiß, dass ich ein Abschlussereignis aus form2 verwenden muss, aber da verliere ich den Überblick.

Danke

War es hilfreich?

Lösung

Eine gute Möglichkeit, dies zu erreichen, ist die Verwendung des Mediator-Musters.Auf diese Weise müssen Ihre Formulare nicht unbedingt voneinander wissen.Erlauben Sie dem Mediator, die Interaktion zwischen den Formularen zu verwalten, damit sich jedes einzelne Formular auf seine eigenen Aufgaben konzentrieren kann.

Ein sehr grober Mediator, der das erreichen würde, was Sie wollen, könnte folgendermaßen implementiert werden:

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

Jetzt wird Ihr Unterformular jedes Mal aktualisiert, wenn das Hauptformular geschlossen wird, und keines muss etwas voneinander wissen.

BEARBEITEN:

Okay, ich werde Ihnen diese Lösung vorstellen, die Ihnen den Einstieg erleichtern soll. Bitte beachten Sie jedoch, dass dies nur eine rudimentäre Implementierung eines Mediator-Musters ist.Ich würde Ihnen dringend empfehlen, sich über dieses Muster und Designmuster im Allgemeinen zu informieren, um besser zu verstehen, was vor sich geht.

Auch hier handelt es sich um ein Beispiel, das jedoch über einige grundlegende Fehlerprüfungen verfügt und Ihnen den Einstieg erleichtern sollte.

Ihre Formulardeklaration wird in etwa so aussehen:

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

Und die modifizierte Implementierung des Mediators würde so aussehen:

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

Andere Tipps

Eine Lösung besteht darin, eine Referenz von Form1 auf Form2 im Konstruktor zu übergeben und einfach f1.invalidat (true) auf dem Schlussereignis von Form2 aufzurufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top