Antes de comenzar a escribir esta pregunta, yo estaba tratando de solucionar después deCómo usar el control WebBrowser Evento DocumentCompleted en C#?
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
El problema era, que si existe un marco flotante en una página web, un evento DocumentCompleted podría ser despedido más de una vez (después de cada documento se ha completado) Era muy probable que el programa hubiera intentado leer datos de DOM que no se completaron y, naturalmente, fallaron.
Pero de repente mientras se escribe esta pregunta '¿Qué pasaría si' monstruo me inspiró, y me fix'ed el problema, que yo estaba tratando de resolver. Como no logré hacer Google en esto, pensé que sería bueno publicarlo aquí.
private int iframe_counter = 1; // needs to be 1, to pass DCF test
public bool isLazyMan = default(bool);
/// <summary>
/// LOCK to stop inspecting DOM before DCF
/// </summary>
public void waitPolice() {
while (isLazyMan) Application.DoEvents();
}
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
if(!e.TargetFrameName.Equals(""))
iframe_counter --;
isLazyMan = true;
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
if (!((WebBrowser)sender).Document.Url.Equals(e.Url))
iframe_counter++;
if (((WebBrowser)sender).Document.Window.Frames.Count <= iframe_counter) {//DCF test
DocumentCompletedFully((WebBrowser)sender,e);
isLazyMan = false;
}
}
private void DocumentCompletedFully(WebBrowser sender, WebBrowserDocumentCompletedEventArgs e){
//code here
}
Por ahora, al menos, mi truco de 5 m parece estar funcionando bien.
Tal vez estoy realmente fracasar en la consulta de Google o MSDN, pero no puedo encontrar: "Cómo utilizar el evento DocumentCompleted control WebBrowser en C#?"
Observación: Después de aprender mucho sobre webcontrol, encontré que hace cosas FuNKY.
Incluso si detecta que el documento se ha completado, en la mayoría de los casos no será así para siempre. La actualización de la página se puede realizar de varias maneras: actualización de marcos, solicitud tipo AJAX o inserción en el lado del servidor (necesita tener algún control que admita la comunicación asíncrona y tenga interoperabilidad html o JavaScript). Además, algunos iframes nunca se cargarán, por lo que no es la mejor idea esperarlos para siempre.
Terminé usando:
if (e.Url != wb.Url)
¿Cuál es el estado de la propiedad IsBusy durante el evento DocumentCompleted? – AMissico
IsBusy devolverá falso tan pronto como el primer cuadro esté listo. – Margus
Solo una nota, su código no funcionará con varios marcos normales. –