2009-01-13 7 views
5

J'ai un formulaire avec des boutons, des textBoxes et des userControls dessus. Quand un bouton est cliqué, il appelle une méthode dans une autre classe. Dans cette classe, une boîte de message s'ouvre. Lorsque l'utilisateur clique sur OK, le messageBox se ferme et la méthode de classe se poursuit pendant 10 secondes avant la fin. Au cours de ces 10 secondes, quel que soit textBox, ou le bouton de la boîte de message était encore affiche le messageBox (Ils ne sont pas repeints).Comment forcer Boutons, TextBoxes à repeindre sur formulaire après qu'un MessageBox se ferme en C#

La question est comment puis-je forcer tout à repeindre sur le formulaire. Le problème est la classe qui a le messageBox n'a pas de connaissance de la forme qui l'a appelé

Frank

Répondre

0

Pour forcer tout à repeindre, vous pouvez appeler Invalidate() sur la principale forme.

6

Est-ce que 10 secondes sont passées à travailler entièrement dans l'interface utilisateur? Sinon, cela devrait vraiment être fait sur un fil séparé. Même si vous actualisez le formulaire lui-même, vous allez toujours avoir une interface utilisateur qui ne répond pas pendant 10 secondes, ce qui n'est pas idéal.

Voir my threading tutorial pour un exemple d'exécution de code dans un thread différent et de rappel au thread de l'interface utilisateur. Soyez conscient que c'est la "vieille" façon de faire les choses - BackgroundWorker rend les choses un peu plus simples.

+0

Je suis d'accord que vous devriez le lancer sur un fil différent. – Vincent

8

Vous pouvez essayer avec

Application.DoEvents() 

juste après la boîte de message se ferme. Cependant, sauf si vous exécutez la méthode que vous appelez dans cette autre classe dans un thread d'arrière-plan, votre interface utilisateur ne répondra pas pendant 10 secondes.

+0

Merci - cela m'a aidé. – xyz

0

Votre problème est que vous faites votre travail sur le fil de l'interface utilisateur. L'interface utilisateur ne sera pas repeinte jusqu'à ce que votre méthode retourne, ce qui permettra à la boucle de message Windows de continuer.

La solution consiste à exécuter votre méthode de travail sur un thread différent. Peut-être que la classe BackgroundWorker résoudra bien votre problème.

Edit: Voir cet article pour une explication approfondie:
http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

+0

LOL - nous étions tous deux en train de modifier pour faire référence au même article :) –

3

Le problème ici est que vous avez un traitement qui se produit sur le thread d'interface utilisateur et de bloquer le message de peinture. Appeler Refresh ou Invalidate ne va pas résoudre ce problème, car vous bloquez toujours sur le thread qui effectuera ces opérations. Plutôt, vous devriez prendre ce traitement et le déplacer vers un autre thread, puis mettre à jour votre thread UI (de manière appropriée, par la méthode Invoke, plus probablement qu'autrement) que vous effectuez le travail sur le thread d'arrière-plan.

Questions connexes