2010-07-13 13 views
8

Ho svolto ricerche su questo argomento e tutti sembrano concordare sul fatto che la soluzione è controllare lo ReadyState del browser Web fino a quando non è impostato su Completo.Evento WebBrowser DocumentCompleted sparato più di una volta

Ma in realtà l'evento viene talvolta attivato con il ReadyState impostato su Completa più volte.

Non penso che ci sia una soluzione con quel Web Browser di schifoso .NET, ma potrebbe essercene uno se utilizzo il componente DOM sottostante.

L'unico problema è che non ho idea di come accedere al componente DOM dietro il WebBrowser che attiva l'evento DocumentCompleted.

risposta

33

DocumentCompleted scatterà per ogni frame nella pagina Web. Il modo più duro è quello di contare fuori le cornici, si mostra come accedere al 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"); 
    } 
} 

Il modo più semplice è quello di verificare l'URL che ha completato il caricamento:

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

Il modo semplice di questa risposta lo ha fatto per me. Anche se sto usando il controllo axWebBrowser1. Ho finito per usare il seguente. if (e.uRL.Equals (axWebBrowser1.LocationURL)) – IamBatman

+0

Grande !! Grazie molto – Grcn

0

Questo probabilmente si verifica se la pagina utilizza Javascript o <meta refresh> per reindirizzare a un'altra pagina.

Se è così, non c'è una buona soluzione.

0

io non riesco a trovare nulla ciò darà il 100% di certezza. Esempio menzionato (e.Url.Equals (webBrowser1.Url)) potrebbe funzionare per un semplice WebBrowser.Navigate (url), tuttavia, nel mio caso, faccio clic sui nodi nel codice per aprire nuovi frame in frame esistenti. Per lo più il numero di volte che il fuoco "Navigating" e "DocumentCompleted" sarà lo stesso, ma di nuovo NON sempre. "isBusy = false" e "ReadyState = Complete" saranno sempre il caso al termine (almeno fino a questo momento), ma alcune volte avranno questo stato quando è ancora in fase di caricamento. Anche il conteggio dei fotogrammi mi sembra inutile, in un caso DocumentCompleted viene lanciato 23 volte, tuttavia, tutti i frame e sub (-sub-sub e così via) sono 14 in totale.

L'unica cosa che sembra funzionare è attendere un breve periodo (1 o 2 secondi?) Per vedere se succede qualcosa (qualsiasi evento sparato, qualsiasi stato cambia).

Hmm, ho trovato un'altra soluzione per me. Spesso non ci interessa l'intera pagina caricata, spesso vogliamo che alcuni elementi esistano. Quindi, dopo ogni DocumentCompleted e quando "isBusy = false" e "ReadyState = Complete" possiamo cercare nel DOM se questo elemento esiste.

Problemi correlati