2010-02-24 15 views
16

Nun, ich benutze ein einfaches Webbrowser-Steuerelement, um zu einer Seite zu navigieren, also muss ich den Text des Formulars dabei ändern. Ich benutze -Warum wird WebBrowser_DocumentCompleted() zweimal ausgelöst?

aber mit einem Haltepunkt, bemerkte ich, dass dieses Ereignis zweimal ausgelöst wird. Ich habe sogar versucht _Navigated() Ereignis. es hat auch zweimal geschossen. Resultierend den Titel "Webber - google.co.in - google.co.in" ..

Ich habe auch bemerkt, dass dieses Ereignis mehrmals beim Laden gefeuert msn.com .. Ich versuche, den Text der Form nur zu ändern, wenn die Seite fertig ist das Laden total ..

Irgendwelche Abhilfe?

Antwort

25

Sie können die WebBrowser.ReadyState überprüfen, wenn das Ereignis ausgelöst wird:

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

Readystate wird so eingestellt werden, abgeschlossen, wenn das gesamte Dokument bereit ist.

+1

Es wird höchstwahrscheinlich wieder für alle externen Javascript Links in der Datei –

+0

feuern Es funktioniert nicht. – SerG

+0

funktioniert es auch nicht für mich. Ich bekomme falsche positive –

3

Es wird einmal pro Frame gefeuert.

17

Jedes Mal, wenn ein Frame geladen wird, wird das Ereignis ausgelöst.

Auch bevor Sie überhaupt dorthin gehen, wird die IsBusy Eigenschaft nur True sein, während der erste Rahmen nicht geladen wurde.

this Versuchen:

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

    //The page is finished loading 
} 
+1

Dieser Block überhaupt nicht schießen .. –

+1

Ich fürchte, zu fragen, aber er verknüpfen Sie es auf das Ereignis auf? Ist das Dokument doch fertig? –

+0

Einfach genial. +1 – Barun

0

Eigentlich wird es nicht immer gefeuert. Habe nicht herausgefunden, warum nicht. Ich habe einen Timer und überprüfe den ReadyState mehrmals für ein paar Minuten. (Verwenden eingebetteter Browsersteuerung).

3

Ich habe das gleiche Problem, und der Grund war, weil standardmäßig, wenn Sie das Steuerelement hinzufügen generieren Designer-Code wie folgt.

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

und wenn Sie die URL ändern, nachdem

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

Aufruf Es wird zwei verschiedene Seiten laden: About: Blank und NewUrl.com

Just, entfernen Sie den Designer-Code ... und du hörst das "doppelte" Ereignis auf.

+0

Ich stieß auf das gleiche Problem und diese Workaround funktionierte gut für mich. Ich bin ein wenig überrascht, die URL-Eigenschaften scheinen irgendwie "in die Warteschlange gestellt" zu sein: der DocumentCompleted-Trigger mit e.Url == "about: blank", auch wenn ich ihn hake (+ =) * nach * a Url = "http: // ... "Erklärung – Larry

0

if (browser.ReadyState != WebBrowserReadyState.Complete) wird empfohlen.

Und wenn es Frames auf der Seite gibt, wird DocumentCompleted mehrmals ausgelöst. Und das ist schwer zu lösen.Einige Möglichkeiten, wie die URLs überprüfen sind nicht korrekt.

BTW, warum das nicht mit:

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

Versuchen Sie, einen festen Präfix verwenden, Problem leicht gelöst werden kann.

1

Möglicherweise werden Sie dieses Ereignis mehrmals abonnieren wie in Ihrer Methode, wenn Sie bei jeder Anmeldung zu diesem Ereignis zur URL navigieren.

Um dieses Problem zu lösen, verschieben Sie diese Zeile aus der Methode und legen Sie sie woanders hin, wo sie nur einmal pro Instanz aufgerufen wird. Im Konstruktor der Klasse vielleicht ... Das sollte dein Problem lösen.

3

Wenn zweimal Brennen ist ein Problem, dann sollte diese Arbeit:

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 
    } 
Verwandte Themen