Prima di iniziare a scrivere a questa domanda, stavo cercando di risolvere i seguentiCome utilizzare il controllo WebBrowser evento DocumentCompleted in C#?
// 1. navigate to page
// 2. wait until page is downloaded
// 3. read and write some data from/to iframe
// 4. submit (post) form
Il problema era, che se un iframe esiste in una pagina web, evento DocumentCompleted otterrebbe sparato più di una volta (dopo ogni documento è stato completato). Era molto probabile che il programma avrebbe cercato di leggere i dati dal DOM che non era stato completato e, naturalmente, fallire.
Ma improvvisamente durante la scrittura di questa domanda 'E se' mostro mi ha ispirato, e ho fix'ed il problema, che stavo cercando di risolvere. Come ho fallito Google, ho pensato che sarebbe stato bello postarlo qui.
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
}
Per ora almeno, il mio mod 5m sembra funzionare bene.
Forse non riesco davvero a interrogare google o MSDN, ma non riesco a trovare: "Come utilizzare il controllo del webbrowser evento DocumentCompleted in C#?"
Nota: Dopo aver appreso molto sul webcontrol, ho scoperto che fa cose FuNKY.
Anche se si rileva che il documento è stato completato, nella maggior parte dei casi non rimarrà tale per sempre. L'aggiornamento delle pagine può essere eseguito in diversi modi: aggiornamento dei frame, richiesta analogica o push lato server (è necessario disporre di un controllo che supporti la comunicazione asincrona e abbia l'interoperabilità HTML o JavaScript). Inoltre, alcuni iframe non verranno mai caricati, quindi non è consigliabile aspettarli per sempre.
ho finito per usare:
if (e.Url != wb.Url)
Qual è lo stato della proprietà IsBusy durante l'evento DocumentCompleted? – AMissico
IsBusy restituirà false non appena il primo frame è pronto. – Margus
Solo una nota, il tuo codice non funzionerà con più frame normali. –