2009-11-24 8 views
1

J'essaie de mettre à jour/peindre une liste en temps réel, mais j'ai quelques problèmes. J'ai un bouton pour démarrer le processus de remplissage de la liste déroulante button_traceroute_Click. Mon problème est que la listbox n'est peinte/mise à jour que lorsque l'ensemble du processus (clic de bouton) est terminé, je voulais que les éléments soient insérés (visualisés) un par un. J'ai déjà essayé d'utiliser ListBox.Update() mais rien ne s'est passé. (ce qui est un traceroute)Problème avec C#, Listbox et GUI

private void button_traceroute_Click(object sender, EventArgs e) 
     { 
      String target; 
      int i = 0; 
      target = textBox_target.Text; 
      Mydata data = new Mydata(); 
      TraceRoute traceroute = new TraceRoute(); 
      while (i < 50 && !data.getReached() && !data.getError()) // i = hop count 
      { 
       data = traceroute.startTrace(target, data, i);    
       listBox_trace.Items.Add(data.getOutput()); 
       i++; 
      } 
     } 

data.getOutput() retourne (string) quelque chose comme: "Hop X: 165.468.354.4 -> 50 ms" ou "Hop X: Délai d'attente"

Mydata{ 
bool Finish flag; 
bool Error flag; 
int badcounter; 
String output; 
} 

Pour l'instant, je remplis la zone de liste avec des chaînes, mais l'objectif est d'utiliser un objet.

Répondre

4

Vous devez mettre l'opération de longue durée sur son propre thread. puis signalez la progression à l'interface utilisateur par intermittence.

Vous pouvez voir un exemple comment faire cela dans un autre poste de la mine here.

0

, vous pouvez également utiliser la méthode BeginUpdate et EndUpdate pour accélérer la remise en peinture de la zone de liste. Lorsque BeginUpdate est appelé, toute peinture en attente dans la zone de liste est suspendue. De même, EndUpdate reprend la peinture. Cela peut aider à donner à votre zone de liste l'apparence d'un chargement rapide des données et de réduire le nombre de peinture. Les données.

Espérons que cela aide, Cordialement, Tom.

0

Essayez ceci:

data = traceroute.startTrace(target, data, i);         
listBox_trace.Items.Add(data.getOutput());     
Application.DoEvents(); 
i++; 

Son pas idéal - réponse de Michael G est le meilleur, mais cela pourrait fonctionner comme une solution rapide.