2010-12-05 5 views
4

J'ai eu affaire à un problème étrange. J'utilise KryptonForm dans un projet. J'ai un formulaire (disons form1) et je dois ouvrir un autre formulaire sur un clic de bouton de ce formulaire. Voici le code:Fermer le formulaire de dialogue ferme la forme parent

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

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

    Visible = true; 
    ShowInTaskbar = true; 
} 

Le problème est que lorsque le Form2 ferme il ferme le Form1 aussi. J'ai essayé le réglage DialogResult = DialogResult.None de Form2 mais en vain. Aidez-moi, s'il vous plaît. J'utilise toujours cette technique et cette chose n'est jamais arrivée.

+0

Avez-vous parcouru cela dans le débogueur pour voir ce qui se passe réellement? Il pourrait y avoir un autre code en cours d'exécution que vous n'avez pas inclus ici. – Darbio

+0

Que se passe-t-il si vous commentez les deux premières lignes de cette méthode? Form1 est-il toujours fermé si vous évitez de le rendre invisible et de masquer son bouton TaskBar? – Ran

+0

Le formulaire parent ('form1') est-il réellement * fermé *, ou reste-t-il seulement * invisible *? – stakx

Répondre

6

Oui, ce code est gênant. Il se passe mal lorsque l'utilisateur ferme la boîte de dialogue. Windows doit alors trouver une autre fenêtre pour mettre l'accent sur. Il n'en reste plus dans votre application, votre fenêtre principale est invisible. Il choisit ensuite une fenêtre d'une autre application. Les chances sont bonnes, par exemple, que ce sera une fenêtre dans Visual Studio. Un gros. Votre formulaire principal disparaît maintenant derrière.

Vous devez vous assurer que votre fenêtre principale est à nouveau visible avant la boîte de dialogue se ferme. Vous pouvez le faire en vous abonnant au gestionnaire d'événements FormClosing du dialogue. Par exemple:

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

Oui @Hans Je pensais aussi sur cette ligne après avoir posé des questions et fait une promenade.Comme nous l'utilisons beaucoup dans les applications que nous construisons au travail et seule la différence est que nous ne le faisons pas Laissez-moi vérifier, BRB: D – TheVillageIdiot

+0

Merci @Hans, en utilisant 'Hide()' au lieu de 'Visible = false;' travaillé – TheVillageIdiot

+0

Hmm, la méthode Hide() contient juste une ligne de code: this.Visible = false; –

0
  • Avez-vous envisagé exceptions? Si Form2 déclenche une exception, vos dernières instructions Visible = true et ShowInTaskbar = true ne seront pas exécutées. Qu'est-ce qui se passe lorsque vous essayez ceci:

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

  • ce qui se passe lorsque vous ouvrez une autre forme qu'un Form2 dans cette méthode?

    Si le problème disparaît, le problème ne se situe probablement pas dans cette méthode, mais avec Form2. Si le problème persiste: Êtes-vous sûr de faire exactement la même chose dans cette méthode que dans les autres méthodes où vous appliquez la même technique?


  • Essayez de supprimer la première ligne et voir si le problème persiste. Ou demandé différemment: Est-ce que votre formulaire parent reste seulement invisible ou est-ce qu'il obtient vraiment fermé?
+1

Bien sûr tout cela serait clair comme jour si le projet a été débogué dans Visual Studio ... – Darbio

+0

Je l'ai débogué et quand je n'ai pas pu @stakx Il n'y a pas d'exception et 'Visible = true; ShowInTaskbar = true;' est exécuté, mais après cela, il ferme le formulaire. Je pense que le point de @Hans Passant est bon et Je vais le tester – TheVillageIdiot

Questions connexes