Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1995 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1888149
Predicator
Posté le 26-05-2009 à 18:47:12  profilanswer
 

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
mood
Publicité
Posté le 26-05-2009 à 18:47:12  profilanswer
 

n°1888370
Predicator
Posté le 27-05-2009 à 09:50:59  profilanswer
 

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
n°1888428
Predicator
Posté le 27-05-2009 à 10:39:25  profilanswer
 

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.

n°1888480
Predicator
Posté le 27-05-2009 à 11:59:56  profilanswer
 

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

n°1888621
Predicator
Posté le 27-05-2009 à 15:28:12  profilanswer
 

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 :)

n°1913088
Tamahome
⭐⭐⭐⭐⭐
Posté le 08-08-2009 à 22:00:06  profilanswer
 


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


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
[Résolu] Joindre une image à un mail avec C#[RESOLU] - [JTree] Activer noeud par un clic
[résolu] Regex pour identifier les bons couples span /spanpb pour fermer une boucle (calculatrice)
Doc automatique en Objective-C?Compilateur C
[Résolu] Comment faites vous pour installer XSLT ? :/[C#] arrondir les angles d'une image
[Resolu] [CSS] padding/margin left marche pas 
Plus de sujets relatifs à : [RESOLU] [C#] [WinForms] WebBrowser et ProgressBar


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR