2009-07-21 7 views
1

J'ai essayé de chercher cela, mais je ne savais pas trop comment le décrire. S'il s'agit d'un doublon, veuillez me diriger vers l'autre question. Merci.Formulaires C# - la forme du dialogue ne disparaît que partiellement avant que la mesure suivante ne soit prise

J'ai créé une application C# Windows Forms en utilisant VS 2008. Dans le formulaire principal, elle ouvre un formulaire de dialogue personnalisé. Lorsque l'utilisateur ferme le formulaire de dialogue, il ne disparaît pas complètement avant que l'application commence dans la tâche suivante. Le contour des différentes parties du formulaire reste jusqu'à ce que certaines tâches supplémentaires soient terminées.

Cela semble très peu professionnel et cela donne l'impression que l'application est cassée, même si tout fonctionne très bien. Est-il possible d'éviter et/ou de résoudre ce problème?

FYI, les tâches supplémentaires sont des calculs demandés après la fermeture du formulaire.

Voici le code de fermeture du formulaire.

private void CloseForm_Click(object sender, EventArgs e) 
{ 
    Properties.Settings.Default.EndDate = cmbBoxRptDate.SelectedValue.ToString(); 
    rptDate = cmbBoxRptDate.SelectedValue.ToString(); 
    Var1 = cmbBoxVar1.SelectedValue.ToString(); 
    Var2 = cmbBoxVar2.SelectedValue.ToString(); 
    this.Close(); 
} 

Voici le code du formulaire principal qui ouvre la boîte de dialogue modale personnalisée, puis la supprime après sa fermeture. Je pense que la disposition peut être redondante puisque le formulaire appelle la méthode de fermeture par elle-même. Puis, une connexion est établie avec SQL Server pour effectuer certains calculs de rapport.

Répondre

1

Ce que vous pouvez faire est de forcer le formulaire appelant à se repeindre après la boîte de dialogue est fermée, avant de poursuivre avec d'autres choses:

RptSettingsForm RS = new RptSettingsForm(); 
DialogResult DR = RS.ShowDialog(); 
this.Refresh(); // force repaint 
String var1 = RS.getVar1().ToString(); 
String var2 = RS.getVar2().ToString(); 
String rptDate = RS.getDate().ToString(); 
RS.Dispose(); 

Notez qu'il existe deux méthodes qui causeront une forme (ou contrôle) pour se repeindre: Invalidate et Refresh. Refresh va forcer une repeinte complète immédiatement. Invalidate ne provoquera pas de repeint immédiat, mais plutôt invalidera la surface de contrôle complète afin que toute la surface soit repeinte la prochaine fois que le contrôle est mis à jour (ce qui peut être un peu retardé si le thread est occupé avec autre chose).

Pour forcer un repeindre après avoir appelé Invalidate, vous pouvez appeler la méthode Update, ce qui entraînera une réimpression immédiate des zones invalidées. Il se peut donc que, dans votre cas, vous puissiez simplement appeler Update au lieu de Refresh, puisque je suppose que les zones précédemment couvertes par la boîte de dialogue devraient être invalidées. Cela pourrait être plus efficace que de forcer un repeint complet:

RptSettingsForm RS = new RptSettingsForm(); 
DialogResult DR = RS.ShowDialog(); 
this.Update(); // force repaint of invalidated areas 
String var1 = RS.getVar1().ToString(); 
String var2 = RS.getVar2().ToString(); 
String rptDate = RS.getDate().ToString(); 
RS.Dispose(); 
+0

Merci pour l'aide. Cela a absolument résolu le problème. –

+0

Glad it aidé. Cela dit; vous devriez vraiment regarder dans les conseils de Jon, ça vaut le coup de regarder. –

0

Il semblerait que votre formulaire principal ne soit pas actualisé. pouvez-vous essayer d'appeler this.Refresh() après showdialog?

2

Je soupçonne que le dernier bit est le plus important:

Ensuite, une connexion est établie à SQL Server pour faire des calculs du rapport.

Est-ce toujours sur le thread d'interface utilisateur? Si c'est le cas, c'est probablement le problème - l'événement repaint pour la fenêtre principale est probablement toujours en attente, mais vous êtes occupé avec la base de données.

La suggestion de Fredrik d'appeler Refresh est une bonne idée, mais vous avez toujours fondamentalement le problème d'en faire trop sur le thread de l'interface utilisateur.Si, pour une raison quelconque, l'établissement d'une connexion à SQL Server prend du temps, votre interface utilisateur sera gelée pendant ce temps. Vous ne pourrez pas la déplacer, la redimensionner, etc.

Opérations de longue durée - y compris à peu près tout ce qui a trait à une base de données - devrait idéalement être fait sur un fil différent. Cela rend les choses plus difficiles, sans aucun doute, mais donne une bien meilleure interface à la fin.

+0

Merci pour l'aide, mais this.refresh() était suffisant pour faire l'affaire. –

+0

Il se peut que vous ayez une connexion rapide au serveur et que tout fonctionne correctement, mais que vous exécutez toujours le * risque * d'une application qui ne répond pas. J'apprécie que cela rende le code beaucoup plus simple cependant. –

+0

Merci pour le conseil. Je vais certainement suivre vos conseils et travailler à l'amélioration de ma candidature de cette manière à l'avenir. J'ai voté pour votre aide. Merci Jon. –

Questions connexes