2011-08-12 4 views
1

J'écris une application SIG en C#. Une partie de l'application permet à l'utilisateur de sélectionner un fichier KML, puis le programme traite ce fichier. J'utilise un OpenFileDialog, mais le problème est que tout le code est exécuté avant la fermeture du dialogue (et après que l'utilisateur a OK le fichier). Cela prend un certain temps parce que le programme doit zoomer et faire d'autres choses. Y at-il un moyen de fermer la boîte de dialogue par programmation avant que mon code est exécuté?Force la boîte de dialogue close in C#

EDIT: Un code pour ceux qui le demandent.

private void OnKMLFileSet(object sender, CancelEventArgs e) 
{ 
    Polygon polygon = KmlToPolygon(openFileDialog2.FileName); 
    // After this, I no longer need the file, but the dialog stays open until the end of the method 
    Graphic graphic = new Graphic(); 
    graphic.Geometry = polygon; 
    textBox1.Text = string.Format("{0:n}", CalculateAreaInSqKilometers(polygon)).Split('.')[0]; 
    textBox2.Text = string.Format("{0:n}", CalculateAreaInSqMiles(polygon)).Split('.')[0]; 
    textBox3.Text = string.Format("{0:n}", CalculateAreaInSqKnots(polygon)).Split('.')[0]; 
    Note polyInfo = new Note("Polygon with nautical area: " + textBox3.Text, polygon); 
    map.Map.ChildItems.Add(polyInfo); 
    map.ZoomTo(polygon.GetEnvelope()); 
} 
+1

Comment votre application peut-elle continuer le traitement lorsque OpenFileDialog est modale? – jgauffin

+0

Je dis qu'après qu'un utilisateur a sélectionné un fichier, est-il possible de simplement masquer la boîte de dialogue, puis de traiter le fichier? –

+0

Laissez-moi reformuler. Je lis dans le fichier (coordonnées et autres) qui ne prend pas de temps. Mais après cela, je veux changer la couleur du graphique sur la carte, et le zoom, et quelques autres choses ... ne nécessitant pas le fichier. Pourtant, le dialogue reste ouvert. –

Répondre

5

Il semble que le dialogue est en fait fermé, mais il est encore « visible » parce que la fenêtre principale est occupée et n'a pas encore repeint lui-même.

Quelques idées:

  • La manière simple: appeler la méthode Refresh() sur la principale forme où le dialogue est encore visible. Appelez-le toujours immédiatement après le retour de ShowDialog.
  • Si le chargement prend un peu de temps, il peut être souhaitable de créer une boîte de dialogue contextuelle de «chargement», éventuellement avec un bouton d'annulation. Utilisez la classe BackgroundWorker pour charger le fichier dans un thread d'arrière-plan. Lorsque le travail est terminé, le fichier est chargé et la fenêtre contextuelle peut être fermée. N'oubliez pas de ne rien modifier dans l'interface utilisateur à partir du thread d'arrière-plan sans synchronisation appropriée.

EDIT: Après avoir regardé le code, je pense que je vois votre problème. Vous gérez l'événement FileOk. Cela aura l'effet que vous essayez d'éviter. Utilisez le dialogue comme ceci:

if (openFileDialog1.ShowDialog() == DialogResult.OK) { 
    // open file 
} 

N'utilisez pas l'événement FileOk. Je n'ai jamais eu de raison de l'utiliser avant ... Aussi, il pourrait être utile de suivre les conseils que j'ai déjà donnés.

+0

bonne estimation, +1;) – jgauffin

+0

Donc, pour éviter tout doute - le problème est que l'utilisateur clique sur OK et votre application commence le traitement dans le formulaire d'appel mais le dialogue reste visible même s'il a été atténué? – ScruffyDuck

Questions connexes