2010-02-24 20 views
16

Bueno, estoy usando un control webbrowser simple para navegar a una página, así que tengo que cambiar el texto del formulario mientras lo hago. Estoy usando -¿Por qué WebBrowser_DocumentCompleted() se activa dos veces?

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    this.Text += " - " + webBrowser1.Document.Domain; 
} 

pero usando un punto de interrupción, me di cuenta de que este evento se está disparando dos veces. Incluso probé el evento _Navigated(). también disparó dos veces. Dando como resultado el título a "Webber - google.co.in - google.co.in" ..

también me di cuenta de que este evento disparado varias veces durante la carga de msn.com .. Estoy tratando de cambiar el texto de la forma sólo cuando la página ha terminado de cargar totalmente ..

¿Algún remedio?

Respuesta

25

Puede comprobar el WebBrowser.ReadyState cuando se dispara el evento:

if (browser.ReadyState != WebBrowserReadyState.Complete) 
    return; 

ReadyState se establecerá en Completar una vez que todo el documento está listo.

+1

lo más probable es que vuelva a activarse para cualquier enlace de JavaScript externo en el archivo –

+0

No funciona. – SerG

+0

no funciona para mí también. Recibo falsos positivos –

3

Se dispara una vez por cuadro.

17

Cada vez que se carga un cuadro, se desencadena el evento.

Además, incluso antes de ir allí, la propiedad IsBusy solo será True mientras no se haya cargado el primer cuadro.

Trate this:

void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) 
    return; 

    //The page is finished loading 
} 
+1

Este bloque no está disparando a todos .. –

+1

Temo preguntar, pero ¿ligo al evento? Todo lo que es, es el documento completado después de todo. –

+0

Simply Brilliant. +1 – Barun

0

How To Determine When a Page Is Done Loading in WebBrowser Control DocumentCompleted es la envoltura del Evert Documento Completo Windows Forms, sin embargo WebBrowserDocumentCompletedEventArgs esconde el parámetro emisor por lo que no se puede saber qué trama está criando el evento. Como alternativa, puede marcar WebBrowser.ReadyState.

0

En realidad, no siempre se dispara. No he resuelto por qué no. Tengo un temporizador y simplemente reviso el ReadyState repetidamente por unos minutos. (Usando el control de navegador incorporado).

3

Tengo el mismo problema, y ​​la razón era porque, de forma predeterminada, cuando agrega el control, genera código de diseñador como este.

this.webBrowser1.Url = new System.Uri("", System.UriKind.Relative); 

y si cambia la URL después de llamar

InitializeComponent(); 
WebBrowser.Navigate("NewUrl.com"); 

Se carga dos páginas diferentes: about: blank y NewUrl.com

Así, quitar el código del diseñador ... y detendrá el evento "doble".

+0

Me encontré con el mismo problema y esta solución funcionó bien para mí. Estoy un poco sorprendido de que las propiedades de URL parezcan "enrutadas" de alguna manera: el documento se completó con e.Url == "about: blank" incluso si lo enganché (+ =) * después de * a Url = "http: // ... "declaración – Larry

0

if (browser.ReadyState != WebBrowserReadyState.Complete) se recomienda.

Y cuando hay marcos en la página, DocumentCompleted se disparará varias veces. Y esto es difícil de resolver. Algunas maneras, como comprobar las direcciones URL no son precisas.

Por cierto, ¿por qué no usar esto:

this.Text = stringA + " - " + webBrowser1.Document.Domain;

Trate de usar un prefijo fijo, problema puede ser resuelto fácilmente.

1

Puede estar suscribiéndose a este evento varias veces como en su método cuando navega a la URL cada vez que se suscribe a este evento.

Para resolver este problema, mueva esa línea fuera del método y colóquelo en otro lugar donde solo se llamará una vez por instancia. En el constructor de la clase tal vez ... Eso debería resolver su problema.

3

Si disparando dos veces es un problema, entonces esto debería funcionar:

string body=""; 

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     if (body == webBrowser1.Document.Body.InnerHtml) return; 
     body = webBrowser1.Document.Body.InnerHtml; 

     // Here is something you want 
    } 
Cuestiones relacionadas