2008-09-03 7 views

Antwort

3

Wenn Sie das Formular in WinForms schließen, werden alle untergeordneten Objekte entfernt. Es ist also keine gute Idee. Sie müssen es asynchron tun, z. B. können Sie eine Nachricht an das übergeordnete Formular senden.

0

Die Form-Klasse bietet keinen Verweis auf das "Eltern" -Formular, daher gibt es keine direkte Möglichkeit, auf den Eltern zuzugreifen (es sei denn, es handelt sich auch um das MDI-Elternteil, in welchem ​​Fall Sie darauf zugreifen könnten) durch die MDIParent-Eigenschaft). Sie müssten im Konstruktor des untergeordneten Elements oder einer Eigenschaft einen Verweis auf das übergeordnete Element übergeben und dann daran denken, es festzulegen, und dann diesen Verweis verwenden, um das Schließen des übergeordneten Elements zu erzwingen.

0

Vielleicht erwägen Sie, dass das übergeordnete Element ein Ereignis für das untergeordnete Element abonniert, und das untergeordnete Element kann dieses Ereignis auslösen, wenn es das übergeordnete Element schließen möchte. Der Elternteil kann dann sein eigenes Schließen (zusammen mit dem des Kindes) handhaben.

0

Sie verwenden eindeutig die richtige Methode zum Öffnen und Schließen von Formularen. Wenn Sie irgendeine Form von MVC oder MVP verwenden, würde dieses Problem nicht auftreten.

Verwenden Sie daher eine Form von MVP oder MVC, um dieses Problem zu lösen.

0

Ich stimme mit davidg; Sie können einen Verweis auf das übergeordnete Formular des Kindes Form Konstruktor hinzufügen und dann das übergeordnete Formular schließen, wie Sie benötigen:

private Form pForm; 
public ChildForm(ref Form parentForm) 
{ 
    pForm = parentForm; 
} 

private closeParent() 
{ 
    if (this.pForm != null) 
     this.pForm.Close(); 
    this.pForm = null; 
} 
+0

Ich habe das gleiche Problem und diese Lösung funktioniert nicht in meinem Fall. Auch in zweiter Form fange ich einen Thread an, verursacht das Problem. – Posto

4

ich auf diesem Blog-Eintrag lief, der wie es funktioniert aussieht und es nutzt die Event-Handler Konzept von D2VIANT Antwort

http://www.dotnetcurry.com/ShowArticle.aspx?ID=125

Zusammenfassung: Schritt 1: erstellen Sie eine neue Windows-Anwendung. Öffnen Sie Visual Studio 2005 oder 2008. Gehen Sie zu Datei> Neu> Projekt> Wählen Sie Visual Basic oder Visual C# in der Windows-Anwendung 'Projekttypen'. Geben Sie dem Projekt einen Namen und einen Speicherort> OK.

Schritt 2: Fügen Sie ein n ew Formular zum Projekt hinzu. Klicken Sie mit der rechten Maustaste auf das Projekt> Hinzufügen> Windows Forms> Form2.cs> Hinzufügen.

Schritt 3: Ziehen Sie in Form1 eine Schaltfläche 'btnOpenForm' und doppelklicken Sie darauf, um einen Ereignishandler zu generieren. Schreibe den folgenden Code hinein. Fügen Sie auch den Ereignishandler frm2_FormClosed wie folgt hinzu:

private void btnOpenForm_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed); 
     frm2.Show(); 
     this.Hide(); 
    } 


    private void frm2_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     this.Close(); 
    } 
0

Es gibt eine sehr einfache Lösung dafür.

Problem (Um sicher zu sein): Startet App (Hauptformular)> Untergeordnetes Formular des Hauptformulars VIA-Schaltfläche oder jedes Ereignis> Schließt (Hauptformular) Aber Kindformular auch schließt.

Lösung:

Verwendung: Process.Start("Your_App's_EXE_Full_Path.exe");

Beispiel: Versuchen Sie, diese vollständigen Pfad zu erhalten:

  1. string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";

  2. Process.Start(FullPath);.

  3. this.Close();

    • diese Weise können Sie alle bilden Sie offen halten wollen, halten erhalten werde.
Verwandte Themen