2009-12-12 6 views
1

J'écris un client IRC, où il y a un parent MDI avec des fenêtres Server et Channel. Lorsque vous fermez une fenêtre de serveur, il demande à l'utilisateur et s'ils veulent le fermer, la connexion au serveur est fermé, etc.Comment inviter correctement l'utilisateur lors de la fermeture d'un formulaire MDI et les enfants?

Je voudrais qu'il y ait une seule invite lorsque le parent MDI est fermé au lieu d'un invite pour chaque serveur. Le problème survient lorsque l'utilisateur tente de fermer le parent, la fonction OnFormClosing de l'enfant Forms est appelée avant celle du parent.

Répondre

0

Modifier l'événement de formulaire enfant MDI FormClosing à ce qui suit:

private void MyChildForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.MdiFormClosing) 
    { 
     e.Cancel = true; 
     return; 
    } 

    // Child window closing code goes here 
} 

Et puis mettez votre invite de fermeture globale/logique dans l'événement FormClosing du formulaire parent MDI. Astuce: utilisez this.MdiChildren en combinaison avec des tests de type fenêtre, c'est-à-dire childForm is IServerForm.

0

Une autre option consiste à attraper le MDI "fermer" AVANT les fenêtres enfants en utilisant le DefWndProc de MDI et "tuer" les fenêtres enfants là.

''' <remarks>Intercept the user clicking on the CLOSE button (or ALT+F4'ing) before the closing starts.</remarks> 
Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message) 

    Try 
     Const SC_CLOSE = &HF060 'http://msdn.microsoft.com/en-us/library/ms646360%28v=vs.85%29.aspx 

     If (m.Msg = WndMsg.WM_SYSCOMMAND) _ 
     AndAlso (m.WParam.ToInt32 = SC_CLOSE) Then 

      If (Not Me.ExitApplicationPrompt()) Then ' Do your "close child forms" here 
       m.Msg = 0 'Cancel the CLOSE command 
      End If 

     End If 

    Catch ex As Exception 
     My.ExceptionHandler.HandleClientError(ex) 
    End Try 

    MyBase.DefWndProc(m) 

End Sub 
Questions connexes