Frage

Ich bin versucht zu erkennen, auf dem übergeordneten MDI, wenn mein Kind MDI Form schließt, und entsprechend reagieren. Der MDI Elternteil sollte erst in den MDI-Kind schließt nichts tun. Hier ist mein Code, ich bin nicht sicher, was ich falsch mache, aber die Form geschlossene Veranstaltung Methode, die ich hinzugefügt wird nie ...

aufgerufen wird

Der folgende Code ist in der übergeordneten MDI-Klasse, wenn das nicht offensichtlich war.

    private void keyValidation()
    {
        if (Properties.Settings.Default.Unlock == true)
            return;
        else
        {
            menu.Enabled = false;
            statusStrip.Enabled = false;

            ValidationForm vf = new ValidationForm();
            vf.MdiParent = this;
            vf.Show();
            vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed);
        }
    }

    void validationForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        MessageBox.Show("Got here");
        if (Properties.Settings.Default.Unlock == true)
        {
            menu.Enabled = true;
            statusStrip.Enabled = true;
        }
    }

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

Dies ist zwar nicht wirklich das Problem lösen, um Sie sich beziehen, zu urteilen aus dem Anwendungsfall, können Sie die Validierung Form als modaler Dialog statt als MDI Kind betrachten wollen zu öffnen.

Sie können dies auf das ShowDialog() -Methode des Formulars verwenden tun, wo man Show() jetzt. Beachten Sie, dass ShowDialog() auch ein DialogResult , wenn Sie sie Tasten auf der anderen Form zuweisen.

Andere Tipps

Vielleicht, nur vielleicht, Sie haben ein Kind Form, dass HIDES nicht geschlossen wird. Versuchen Einhaken Visible und sehen, was passiert.

Auch Formclosing ermöglicht es Ihnen, Schließung abzubrechen und Formclosed hat man diese Möglichkeit nicht geben.

Verwenden Sie das Closed Ereignis nicht. Verwenden Sie stattdessen das FormClosing Ereignis:

private void frmMain_FormClosing(object sender, FormClosingEventArgs e){
  if (MessageBox.Show("Are you sure you want to Exit", "Confirmation", MessageBoxButtons.YesNo,MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.No) {
    e.Cancel = true;
  }
}

Wenn die Parent als MdiContainer markieren, indem Sie die IsMdiContainer auf true setzen, das ParentForm.ControlAdded Ereignis zum Hinzufügen der „MdiClient“ Kontrolle auf das Mutterform erhoben. Also, wenn MdiClient Mutter MDI-Formular hinzufügen, können wir das ControlAdded Ereignis für die MdiClient Kontrolle als wie unten,

erhöhen
  public ParentForm()
  {
    InitializeComponent();
    this.ControlAdded += Form1_ControlAdded;
    this.IsMdiContainer = true;

Wir brauchen die MdiClient.ControlAdded wie wie die folgenden,

erhöhen
    void Form1_ControlAdded(object sender, ControlEventArgs e)
      {
           if(e.Control is MdiClient)
                e.Control.ControlAdded += MdiClient_ControlAdded;

      }

Standardmäßig werden die MDI Child-Formulare hinzugefügt werden in die Kontrollen Sammlung des MdiClient in Parent Form. Also, wenn der ChildForm.MdiParent Wert als Parent-Formular festgelegt, die ControlAdded Ereignis für die MdiClient erhöhen wird .

void MdiClient_ControlAdded(object sender, ControlEventArgs e)
{
    if (e.Control is Form)
        {
            var form = e.Control as Form;
            form.FormClosing += form_FormClosing;
            form.FormClosed += form_FormClosed;
        }
}

In diesem oben MdiClient_ControlAdded wirft Methode, wenn Kind-Form in die Mutter MDI-Formular hinzugefügt. So durch die Formclosing Anheben und Formclosed Veranstaltungen für Kinder Formulare können Sie leicht erkennen, ob das Kind Form geschlossen ist oder nicht.

Warum sind Sie so viele Dinge zu tun, wenn man nur einen Event-Handler von MDI Parent MDI Child aufrufen?

Angenommen ich tun möchte, wird bestimmte Dinge, wenn mein Kind aktiviert oder deaktiviert werden. Sie müssen nur einige Event-Handler von MDI Elternteil erklären (wie zum Beispiel SetupToolStripMenu_PlantMasterRecipe) und eine gewisse Logik innerhalb erwähnen, dass, was Sie tun wollen. Auf diese Weise können Sie jedes Objekt Verhalten von MDI Kind von MDI Elternteil Kontrolle zu bringen.

Hier objB ist mein Kind Form und ich schreibe diesen Code innerhalb MDI Parent:

objB.MdiParent = this;

objB.Activated += SetupToolStripMenu_PlantMasterRecipe;

objB.Deactivate += DisposeToolStripMenu;

objB.Show();

Auf MdiParent macht eine öffentliche Funktion

public void MakeMenuVisible()
{
MainMenu.visible = true;
}

Dann auf Child können Sie die Funktion wie diese

laufen
private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//Cast MdiParent to Mainform
((mainform)this.MdiParent).MakeMenuVisible();  
}
scroll top