2010-12-05 10 views
4

Ich habe mich mit einem seltsamen Problem beschäftigt. Ich verwende KryptonForm in einem Projekt. Ich habe ein Formular (sagen wir Formular1) und ich muss ein anderes Formular auf einen Knopfklick von diesem Formular öffnen. Hier ist der Code:Schließen des Dialogformulars schließt das Elternformular

void btn_click(object sender, EventArgs e) 
{ 
    Visible = false; 
    ShowInTaskbar = false; 

    var f = new Form2(); 
    f.ShowDialog(); 

    Visible = true; 
    ShowInTaskbar = true; 
} 

Das Problem ist, dass, wenn die Form2 schließt es schließt das Form1 auch. Ich habe versucht, DialogResult = DialogResult.None von Form2 zu setzen, aber ohne Erfolg. Bitte hilf mir.

Ich benutze immer diese Technik und dieses Ding ist nie passiert.

+0

Haben Sie dies im Debugger durchlaufen, um zu sehen, was wirklich vor sich geht? Es könnte ein anderer Code ausgeführt werden, den Sie hier nicht aufgeführt haben. – Darbio

+0

Was passiert, wenn Sie die ersten beiden Zeilen in dieser Methode auskommentieren? Wird Form1 immer noch geschlossen, wenn Sie es vermeiden, es unsichtbar zu machen und seine TaskBar-Schaltfläche zu verbergen? – Ran

+0

Ist das übergeordnete Formular ('form1') tatsächlich * geschlossen *, oder bleibt es nur * unsichtbar *? – stakx

Antwort

6

Ja, dieser Code ist mühsam. Es geht schief, wenn der Benutzer den Dialog schließt. Windows muss dann ein anderes Fenster finden, um den Fokus zu geben. In Ihrer App ist nichts mehr vorhanden, Ihr Hauptfenster ist nicht sichtbar. Es wählt dann ein Fenster einer anderen App aus. Die Vorteile sind zum Beispiel gut, dass dies ein Fenster in Visual Studio sein wird. Ein großer. Ihre Hauptform verschwindet nun dahinter.

Sie müssen sicherstellen, dass Ihr Hauptfenster wieder sichtbar ist vor der Dialog schließt. Sie können dies tun, indem Sie den FormClosing-Ereignishandler des Dialogfelds abonnieren. Zum Beispiel:

private void button1_Click(object sender, EventArgs e) { 
     using (var dlg = new Form2()) { 
      dlg.StartPosition = FormStartPosition.Manual; 
      dlg.Location = this.Location; 
      dlg.FormClosing += (s, ea) => this.Show(); // <=== Here 
      this.Hide(); 
      if (dlg.ShowDialog() == DialogResult.OK) { 
       // etc... 
      } 
     } 
    } 
+0

Ja @Hans Ich dachte auch über diese Zeile nach dem Stellen der Frage nach und machen Sie einen Spaziergang.Weil wir dies oft in Anwendungen verwenden, bauen wir bei der Arbeit und der einzige Unterschied ist, dass wir es nicht tun Verstecke das Formular, aus dem wir ein anderes Formular als Dialog zeigen Lass es mich überprüfen, BRB: D – TheVillageIdiot

+0

Danke @Hans, benutze 'Hide()' anstelle von 'Visible = false;' gearbeitet. – TheVillageIdiot

+0

Hmm, die Hide() Methode enthält nur eine Codezeile: this.Visible = false; –

0
  • Haben Sie darüber nachgedacht Ausnahmen? Wenn Form2 eine Ausnahme auslöst, werden Ihre letzten Anweisungen Visible = true und ShowInTaskbar = true nicht ausgeführt. Was passiert, wenn Sie versuchen, diese:

    ShowInTaskbar = Visible = false; 
    try 
    { 
        using (var f = new Form2()) // (added since Form2 is an IDisposable) 
        { 
         f.ShowDialog(); 
        } 
    } 
    finally // make sure that the following gets executed even when 
    {  // exceptions are thrown during f.ShowDialog(): 
        ShowInTaskbar = Visible = true; 
    } 
    

  • Was passiert, wenn Sie eine andere Form als eine Form2 innerhalb dieser Methode öffnen?

    Wenn das Problem verschwindet, ist das Problem wahrscheinlich nicht innerhalb dieser Methode, aber mit Form2.

    Wenn das Problem weiterhin besteht: Sind Sie sicher, dass Sie in dieser Methode genau dasselbe tun als in anderen Methoden, bei denen Sie die gleiche Technik anwenden?


  • Versuchen Sie, die erste Zeile zu entfernen und sehen, ob das Problem weiterhin besteht. Oder anders gefragt: Bleibt Ihre Elternform nur unsichtbar oder erhält es wirklich geschlossen?
+1

Natürlich wäre das alles klar als Tag, wenn das Projekt in Visual Studio debuggt wurde ... – Darbio

+0

Ich habe es debuggt und als ich es nicht konnte Ich habe beschlossen, es hier zu erhöhen. @ stakx Es gibt keine Ausnahme und 'Visible = true; ShowInTaskbar = true;' wird ausgeführt. Aber danach schließt es das Formular. Ich denke @Hans Passant ist ein guter Punkt und Ich werde es testen – TheVillageIdiot

Verwandte Themen