2016-12-09 2 views
0

In den MDI-Elternformularen (mit der Eigenschaft this.IsMdiContainer = true) dürfen wir keine untergeordneten Formulare mit der Methode ShowDialog(); automatisch die folgende Ausnahme ausgelöst:Wie ermöglicht ShowDialog MDI Kinder auf MDI Form Eltern?

Eine erste Chance Ausnahme des Typs ‚System.InvalidOperationException‘ in System.Windows.Forms.dll aufgetreten

Zusätzliche Informationen: Form, die kein Formular der obersten Ebene ist kann nicht als modales Dialogfeld angezeigt werden. Entfernen Sie das Formular von einem übergeordneten Formular , bevor Sie ShowDialog aufrufen.

Hat jemand eine Umgehung dieses Problems herausgefunden?

+1

Setzen Sie einfach nicht die MdiParent Eigenschaft des Formulars und ShowDialog() wird gut funktionieren. –

Antwort

1

Eine einfache und saubere Lösung, die ich in meinen Projekten implementiert habe, ist die Verwendung einer Callback-Funktion (Action<T> in C#), die ausgelöst wird, wenn der Benutzer die gewünschte Eingabe eingibt.

Beispiel Showdialog mit:

private void cmdGetList_Click(object sender, EventArgs e) 
{ 
    string strInput = ""; 

    frmInputBox frmDialog = new frmInputBox("User input:"); 

    if (frmDialog.ShowDialog() == DialogResult.OK) 
     strInput = frmDialog.prpResult; 
    else 
     strInput = null; 
} 

ShowDialog Boxeingang es außerhalb des MDI Hauptformular ist.

Jetzt; die Lösung mit Show:

private void cmdGetList_Click(object sender, EventArgs e) 
{ 
    getInput(this, (string strResult) => 
     { 
      MessageBox.Show(strResult); 
     }); 
} 

private void getInput(Form frmParent, Action<string> callback) 
{ 
    // CUSTOM INPUT BOX 
    frmInputBox frmDialog = new frmInputBox("User input:"); 

    // EVENT TO DISPOSE THE FORM 
    frmDialog.FormClosed += (object closeSender, FormClosedEventArgs closeE) => 
    { 
     frmDialog.Dispose(); 
     frmDialog = null; 
    }; 

    frmDialog.MdiParent = frmParent; // Previosuly I set => frmParent.IsMdiContainer = true; 

    // frmDialog.ShowDialog(); <== WILL RAISE AN ERROR 
    // INSTEAD OF: 
    frmDialog.MdiParent = frmParent; 

    frmDialog.FormClosing += (object sender, FormClosingEventArgs e) => 
    { 
     if (frmDialog.DialogResult == DialogResult.OK) 
      callback(frmDialog.prpResult); 
     else 
      callback(null); 
    }; 

    frmDialog.Show(); 
} 

Das Eingabefeld (Oder irgendeine Form wird innerhalb des übergeordneten MDI-Formulars anzuzeigen): ShowExample

Der Trick ist, zu verwenden, um eine Callback-Funktion (Aktion auf C#) zu verwalten, wenn Der Benutzer hat eine Eingabe gemacht.

Es sind mehr Codezeilen, aber es ist wertlos, ein sauberes Projekt anzuzeigen. Final result

+0

großartige Antwort Danke ... Ich habe 3 Stunden lang an diesem Thema gearbeitet und es gelöst. –