[RESOLU] [C#] [WinForms] WebBrowser et ProgressBar

WebBrowser et ProgressBar [RESOLU] [C#] [WinForms] - C#/.NET managed - Programmation

Marsh Posté le 26-05-2009 à 18:47:12    

Bonsoir,
 
J'ai un contrôle qui contient un élément Webbrowser, et un autre ProgressBar qui est là pour afficher l'avancement du chargement de la page.
 
Pour faire simple, sur l'évènement ProgressChanged, je modifie les valeurs de la ProgressBar :
 

Code :
  1. private void webBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
  2.         {
  3.             int value = (int) (100 * (e.CurrentProgress / e.MaximumProgress));
  4.             if (e.CurrentProgress == -1)
  5.             {
  6.                 webBrowserProgressBar.Value = 0;
  7.             }
  8.             else
  9.             {
  10.                 webBrowserProgressBar.Value = value;
  11.             }
  12.         }


 
Problème, la progressBar n'évolue absoluement pas pendant le chargement de la page, mais le fait, de manière continue, à la fin du chargement de la page. Preuve s'il en est que j'ai ajouté aux évènements "début de chargement" et "document chargé" l'affichage et le masquage de ce composant :
 

Code :
  1. private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  2.         {
  3.             webBrowserProgressBar.Visible = false;
  4.         }
  5.         private void webBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
  6.         {
  7.             webBrowserProgressBar.Visible = true;
  8.         }


 
Résultat : La progressBar n'évolue pas le temps qu'elle est affichée, c'est donc bien que les évènements sont stockés, mais appliqués seulement après la fin du chargement.
J'ai fouiné sur le net, et tous les tutoriels présente le même code que moi, peu ou proue.
Quelqu'un sait comment faire en sorte que la progressBar se mette correctement à jour ? Il faudrait le faire dans un thread parallèle, mais ces choses là apportent des dépendances croisées qui ne me plaisent pas des masses. Y'a-t-il un moyen "propre" et standard de le faire dans les WinForms ?
 
Merci. [:flclsd]  
[/code]


Message édité par Predicator le 27-05-2009 à 15:28:27
Reply

Marsh Posté le 26-05-2009 à 18:47:12   

Reply

Marsh Posté le 27-05-2009 à 09:50:59    

Le maximum est défini, dans les propriétés de la progressBar, directement depuis le concepteur de vue. C'est bêtement un pourcentage, donc le max est 100, d'où le calcul sur 100 dans la méthode...
 
Au final, ça revient au même, et le résultat est le même, le problème est surtout que l'avancement ne se fait qu'après la fin du chargement de la page :/
 
J'ai quand même modifié deux trois choses, notamment viré le contrôle de valeur, relativement inutile dans ce cas :
 

Code :
  1. private void webBrowser_Navigating(object sender, WebBrowserNavigatingEventArgs e)
  2.         {
  3.             webBrowserProgressBar.Visible = true;
  4.         }
  5. private void webBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
  6.         {
  7.             int value = Convert.ToInt32(100 * (e.CurrentProgress / e.MaximumProgress));
  8.             webBrowserProgressBar.Value = value;
  9.         }
  10. private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  11.         {
  12.             webBrowserProgressBar.Visible = false;
  13.             webBrowserProgressBar.Value = 0;
  14.         }


Message édité par Predicator le 27-05-2009 à 09:55:05
Reply

Marsh Posté le 27-05-2009 à 10:39:25    

Oh, j'ai oublié la seconde question.
Oui, ProgressChanged est bien appelé, et le code contenu bien exécuté, mais ça ne transparaît pas dans l'interface tant que la page n'a pas été totalement chargée.

Reply

Marsh Posté le 27-05-2009 à 11:59:56    

J'ai testé et ça ne change rien :(

Reply

Marsh Posté le 27-05-2009 à 15:28:12    

Problème résolu sur un autre forum.
 
MaximumProgress et CurrentProgress sont des valeurs complètements bidons (10000 et des multiples de 50).
 
Dans ces conditions, avec la perte de précision de mon calcul, la barre ne décollait jamais.
 
En mettant le max et le current comme tu le dis, on voit enfin la barre évoluer, mais elle atteint à peine les 10% quand la page s'est entièrement chargée.
 
Donc le problème ne venait pas des threads, mais bel et bien des propriétés de WebBrowser qui fournissent des valeurs bidons.
 
La solution que j'ai choisie est de passer au type Marquee pour la progressBar. Du coup, elle indique juste que le browser travaille, mais ne fournit aucune info sur le pourcentage d'avancement.
 
Merci pour l'aide :)

Reply

Marsh Posté le 08-08-2009 à 22:00:06    


 
euh oui mais non, pour ca il faut utiliser un BackgroundWorker, c'est justement fait pour ca...


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed