Vor Beginn diese Frage schreiben, versuche ich wurde nachWie WebBrowser Steuerelement DocumentCompleted Ereignis in C# verwenden?
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
das Problem zu lösen war, dass, wenn ein iframe auf einer Webseite vorhanden ist, würde Document Ereignis mehr als einmal gefeuert werden (nach jedem Dokument abgeschlossen ist). Es war sehr wahrscheinlich, dass das Programm versucht hätte, Daten aus dem DOM zu lesen, die nicht vollständig waren und natürlich fehlschlagen.
Aber plötzlich beim Schreiben dieser Frage ‚Was wäre, wenn‘ Monster mich inspiriert, und ich fix'ed das Problem, dass ich zu lösen versuchte. Da ich das bei Google nicht geschafft habe, dachte ich, es wäre nett, es hier zu posten.
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
}
Für jetzt zumindest scheint mein 5m Hack gut zu funktionieren.
Vielleicht bin ich wirklich fehlgeschlagen bei der Abfrage von Google oder MSDN, aber ich kann nicht finden: "Wie verwendet man das webbrowser Steuerelement DocumentCompleted Ereignis in C#?"
Bemerkung: Nachdem ich viel über Webcontrol gelernt habe, habe ich festgestellt, dass es FuNKY Zeug macht.
Auch wenn Sie feststellen, dass das Dokument abgeschlossen ist, wird es in den meisten Fällen nicht für immer so bleiben. Die Seitenaktualisierung kann auf verschiedene Arten erfolgen: Frame-Refresh, Ajax-ähnliche Anfrage oder Server-Side-Push (Sie benötigen eine Kontrolle, die asynchrone Kommunikation unterstützt und über HTML- oder JavaScript-Interop verfügt). Außerdem werden einige Iframes niemals geladen, daher ist es nicht die beste Idee, für immer auf sie zu warten.
ich landete mit:
if (e.Url != wb.Url)
Was ist der Status der IsBusy-Eigenschaft während des DocumentCompleted-Ereignisses? – AMissico
IsBusy wird false zurückgeben, sobald der erste Frame bereit ist. – Margus
Nur eine Anmerkung, Ihr Code wird nicht mit mehreren normalen Frames arbeiten. –