2010-07-13 6 views
8

J'ai fait des recherches sur ce sujet et tout le monde semble être d'accord que la solution est de vérifier le ReadyState du navigateur Web jusqu'à ce que soit défini sur Terminé.WebBrowser DocumentCompleted événement tiré plus d'une fois

Mais en réalité, l'événement est parfois déclenché avec le ReadyState défini pour terminer plusieurs fois.

Je ne pense pas qu'il existe une solution avec ce .NET WebBrowser merdique, mais il pourrait y avoir un si j'utilise le composant DOM sous-jacent.

Seul problème est, je ne sais pas comment accéder au composant DOM derrière le WebBrowser qui déclenche l'événement DocumentCompleted.

Répondre

33

La dure est de compteras les images, vous montre comment accéder au DOM:

private int mFrameCount; 

private void startNavigate(string url) { 
    mFrameCount = 0; 
    webBrowser1.Navigate(url); 
} 

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
    mFrameCount += 1; 
    bool done = true; 
    if (webBrowser1.Document != null) { 
    HtmlWindow win = webBrowser1.Document.Window; 
    if (win.Frames.Count > mFrameCount && win.Frames.Count > 0) done = false; 
    } 
    if (done) { 
    Console.WriteLine("Now it is really done"); 
    } 
} 

Le moyen facile est de vérifier l'URL terminé le chargement:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.Equals(webBrowser1.Url)) { 
     Console.WriteLine("Now it is really done"); 
    } 
} 
+0

Le moyen facile de cette réponse l'a fait pour moi. Même si j'utilise le contrôle axWebBrowser1. J'ai fini par utiliser ce qui suit. if (e.uRL.Equals (axWebBrowser1.LocationURL)) – IamBatman

+0

Génial !! Merci beaucoup – Grcn

0

Cela se produirait probablement si la page utilisait Javascript ou <meta refresh> pour rediriger vers une autre page.

Si oui, il n'y a pas de bonne solution de contournement. DocumentCompleted déclenchera pour chaque image de la page Web

0

Je ne trouve rien cela donnera 100% de certitude. Mentionné exemple (e.Url.Equals (webBrowser1.Url)) peut fonctionner pour un simple WebBrowser.Navigate (url), cependant, dans mon cas, je clique sur les nœuds dans le code pour ouvrir de nouvelles images dans les cadres existants. La plupart du temps, le nombre de fois que le feu «Navigating» et «DocumentCompleted» sont identiques, mais pas toujours. "isBusy = false" et "ReadyState = Complete" sera toujours le cas quand il est fini (au moins jusqu'à présent) mais il aura aussi quelques fois cet état quand il est encore en chargement. Le décompte des images semble également inutile pour moi, dans un cas DocumentCompleted est déclenché 23 fois, cependant, toutes les trames et les sous-trames (-sub-sub et ainsi de suite) sont au total au nombre de 14. La seule chose qui semble fonctionner est d'attendre une courte période (1 ou 2 secondes?) Pour voir si quelque chose se passe (tout événement déclenché, tout changement d'état).

Hmm, j'ai trouvé une autre solution pour moi. Souvent, nous ne sommes pas intéressés par le chargement de toute la page, souvent nous voulons que certains éléments existent. Donc après chaque DocumentCompleted et quand "isBusy = false" et "ReadyState = Complete" nous pouvons rechercher le DOM si cet élément existe.

Questions connexes