2009-09-30 6 views
1

J'ai un programme simple qui boucle dans un jeu de résultats quand un bouton est pressé et effectue des actions contre ce resultset (stocké dans un DataTable). Pendant la boucle, je mets à jour le texte d'un RichTextBox, 2 étiquettes, et un ToolStripStatusLabel. Ceux-ci ne sont pas rafraîchissants pendant la boucle, donc après que chaque élément est traité dans la boucle, je fais un this.Refresh(). Cela fonctionne à moins que je clique sur quelque chose dans le programme, à ce moment, il dit qu'il ne répond pas, et rien n'est actualisé dans le formulaire jusqu'à ce que la boucle foreach se termine..NET Windows Forms Refresh Control

private void myBtn_Click(object sender, EventArgs e) 
{ 
    // Query database and store results in DataTable dt. 

    foreach (DataRow dr in dt.Rows) 
    { 
     // Process row data. 
     // Update RichTextBox, labels, and ToolStripStatusLabel. 
     this.Refresh(); 
    } 
} 

Quelque chose ne va pas ici? Y a-t-il une meilleure manière de faire cela? Ceci est une application Windows Forms utilisant C#.

Répondre

5

Il est dit "ne répond pas" parce que vous tirez le fil de l'interface graphique. Si vous avez une longue opération à effectuer, pensez à utiliser un thread d'arrière-plan à la place. Pour commencer, consultez BackgroundWorker. Il s'agit d'un threading tutorial, juste au cas où.

+0

Si je déplace cette logique vers un thread d'arrière-plan, ne verrouille-t-elle pas également ce thread? Ou peut-être appeler le this.Refresh dans le fil principal à partir du fil d'arrière-plan? –

+0

Votre thread d'arrière-plan serait occupé, mais cela n'affecterait pas l'interface graphique (votre programme resterait résonnant). Vous devrez également utiliser Invoke (ou BeginInvoke) pour modifier votre GUI à partir du thread d'arrière-plan. –

+0

J'ai travaillé en traitant cette logique dans un environnement de travail et en mettant à jour l'interface utilisateur avec des délégués/invoke. Merci –