¿Por qué WebBrowser_DocumentCompleted () se activa dos veces?

Bueno, estoy usando un control de navegador web simple para navegar a una página, así que tengo que cambiar el texto del formulario mientras lo hago. Estoy usando –

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

pero usando un punto de interrupción, noté que este evento se dispara dos veces. Incluso probé el evento _Navigated() . también disparó dos veces. Resultando el título de "Webber - google.co.in - google.co.in" ..

También noté que este evento se activó varias veces al cargar msn.com. Intento cambiar el texto del formulario solo cuando la página ha terminado de cargarse por completo.

¿Algún remedio?

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

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

ReadyState se configurará en Completado una vez que todo el documento esté listo.

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

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

Prueba esto :

 void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return; //The page is finished loading } 

Se dispara una vez por cuadro.

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

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

y si cambias la URL después de llamar

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

Cargará dos páginas diferentes: Acerca de: Blank y NewUrl.com

Solo, elimine el código de diseñador … y detendrá el evento “doble”.

Si disparar dos veces es un problema, entonces 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 } 

Puede ser que esté suscribiéndose a este evento varias veces como en su método cuando navega a 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.

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

if (browser.ReadyState != WebBrowserReadyState.Complete) es recomendado.

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

Por cierto, ¿por qué no usar esto?

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

Intente usar un prefijo fijo, el problema puede resolverse fácilmente.

Cómo determinar cuándo se completa una página Cargar en WebBrowser Control DocumentCompleted es el contenedor de WinForms del eComplete DocumentExt, sin embargo, WebBrowserDocumentCompletedEventArgs oculta el parámetro del remitente por lo que no puede decir qué marco está provocando el evento. Alternativamente, puede consultar WebBrowser.ReadyState .