Auf dynamische erstellte Webbrowser warten

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Semiconductor.

    Auf dynamische erstellte Webbrowser warten

    huhu liebe Community,

    ich stehe vor folgendem Problem:

    Ich generiere zur Laufzeit Webbrowser und füge denen ein Document Completed Handler hinzu.

    VB.NET-Quellcode

    1. Dim webo As New WebBrowser()
    2. AddHandler webo.DocumentCompleted, AddressOf DocumentCompleteEventHandler
    3. webo.Navigate(httpurl.tostring)


    Soweit funktioniert das. Leider habe ich die Schwierigkeit, für jeden einzelnen dynamisch erzeugten Webbrowser die Document Completed zu überwachen. Kann man denn auch Parameter an die AddHandler senden?

    VB.NET-Quellcode

    1. Private Sub DocumentCompleteEventHandler(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
    2. End Sub


    Bei einem festen Webbrowser sah es beispielsweise so aus:

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. If httpurl.ToString = WebBrowser1.Url.ToString Then
    3. fullyLoaded = True
    4. Button2.Show()
    5. End If
    6. End Sub


    Wie könnte ich dies für die dynamischen Controls am besten lösen?

    Vielen Dank im Voraus!

    MfG
    Dafür gibt es doch das sender-Objekt in Deinem DocumentCompleteEventHandler, welches eben genau beinhaltet, wer da grad fertig geworden ist (oder allgemein: welches Objekt das Event, in dem Fall DocumentCompleted, gefeuert hat -> If httpurl.ToString = DirectCast(sender, WebBrowser).Url.ToString ...
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi,

    vielen Dank für die Info, dadurch kann ich auf jeden Fall die einzelnen Webbrowser abwarten, bzw. das hilft mir vor allem, wenn die URLs alle unterschiedlich sind.

    Wie sieht es aber mit folgendem Szenario aus? Alle Webbrowser greifen auf den gleichen Link, wie kann ich die dann unterscheiden?

    VB.NET-Quellcode

    1. Private Sub Button14_Click_1(sender As Object, e As EventArgs) Handles Button14.Click
    2. Dim web1 As New WebBrowser()
    3. AddHandler web1.DocumentCompleted, AddressOf DocumentCompleteEventHandler
    4. web1.Navigate(httpurl.tostring)
    5. Dim web2 As New WebBrowser()
    6. AddHandler web2.DocumentCompleted, AddressOf DocumentCompleteEventHandler
    7. web2.Navigate(httpurl.tostring)
    8. End Sub
    9. End Class
    10. Private Sub DocumentCompleteEventHandler(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
    11. If httpurl.tostring = DirectCast(sender, WebBrowser).Url.ToString Then
    12. MsgBox("Fertig")
    13. End If
    14. If httpurl.tostring = DirectCast(sender, WebBrowser).Url.ToString Then
    15. MsgBox("Fertig")
    16. End If
    17. End Sub
    ? Irgendwie blick ich's grad nicht. Zeile 14-16 und 18-20 sind doch identisch, also sind 18-20 überflüssig. Ich versteh wohl auch nicht, was Du überhaupt erreichen willst. Es ist doch so: Die Sub DocumentCompleteEventHandler wird immer dann aufgerufen, wenn ein WebBrowser seine Seite fertig geladen hat. Welche Seite das ist, ist da erstmal schnurz. Das Event wird ja unabhängig von der aufgerufenenen Seite gefeuert/ausgelöst. Dass Du dann noch Vergleiche mit einer Seite machen willst, bleibt Dir überlassen.
    Daher die Frage: Was soll geschehen, wenn ein WebBrowser mit dem Laden fertig ist? Soll dann für jeden WebBrowser was anderes geschehen? Oder für alle das gleiche?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Wenn Webbrowser X fertig ist, soll eine Variable quasi geändert werden wie hier:

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. If httpurl.ToString = WebBrowser1.Url.ToString Then
    3. fullyLoaded = True
    4. Button2.Show()
    5. End If
    6. End Sub

    Für jeden Webbrowser will ich etwas anderes machen.




    Das Fullyloaded ist hier ein Beispiel, das fehlt ja in deinem Beispiel ,daher weiß ich nicht, wie ich das implementieren soll.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Semiconductor“ ()

    Anders: was ist httpurl, was bewirkt fullyLoaded und was hat es für einen Sinn, Button2 zu zeigen?
    Denn: wenn WebBrowser X fertig mit der Seite ist, die Du mit webo.Navigate(httpurl.tostring) (Post #1), aufrufst, wird DocumentCompleteEventHandler aufgerufen. So ist es bereits durch Deinen Post #1 festgelegt. Ob Du webo.Navigate("www.google.de") oder webo.Navigate("www.vb-paradise.de") oder was auch immer festlegst, ist wurscht. Wenn die Seite komplett geladen ist, wird DocumentCompleteEventHandler aufgerufen, mit dem spezifischen WebBrowser als sender-Objekt.
    Ich weiß einfach immer noch nicht, was Dein Ziel ist. Versuch doch mal in Worten, nicht mit Code zu beschreiben, was genau in Deinem Code passieren soll, sobald einer Deiner theoretisch 20 WebBrowser seine Seite (welche auch immer das ist) geladen hat. Und wodurch wird httpurl festgelegt bzw. welche Bedeutung hat es? Zum anderen: fullyLoaded scheint eine globale Variable zu sein. Diese würde momentan immer zu true werden, sobald irgendein WebBrowser mit seiner Aufgabe fertig ist. Ist das gewollt?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Zum letzten Satz: Fullyloaded soll für jede einzelne Webbrowser existieren. Das ist der springende Punkt. Für jeden fertig geladenen Webbrowser will ich zur Laufzeit erzeugte Buttons erscheinen lassen (Die habe ich nicht implementiert, da ich erst mit einzelnen Webbrowsern gearbeitet habe. Das kommt ja später.)

    Deswegen soll für jeden Document Completed eine eigene Variable (Fullyloadedx) auf true gesetzt werden, sodass ich dann fortsetzen kann.

    Button2 ist lediglich für mich ein visueller Indikator gewesen, der erscheint, sobald der Webbrowser erscheint.
    httpurl ist eine einfache url (google.de)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Semiconductor“ ()

    Aha! Nun, ich sehe da 2 Möglichkeiten:
    • Du lässt die FullyLoaded-Variable weg und schreibst eben in Deinen DocumentCompleteEventHandler in Abhängigkeit von Deinem WebBrowser/sender-Object rein, was passieren soll
    • Du arbeitest nicht mit dem "nativen WebBrowser", sondern erstellst Dir ne Klasse (z.B. namens WebBrowserEx), die von WebBrowser erbt und eine Variable FullyLoaded enthält (denn anders lässt sich eine objektspezifische Variable nicht (sinnvoll) erstellen). Dann kannst Du in den erweiterten WebBrowser noch dazudichten, was Du brauchst, also z.B. eine Liste von Buttons, die dann beim Fertigladen angezeigt werden sollen. Obwohl mir immer noch nicht klar ist, was Du vorhast.
    WebBrowserEx

    VB.NET-Quellcode

    1. Private Class WebBrowserEx : Inherits WebBrowser
    2. Public Property FullyLoaded As Boolean = False
    3. Public Delegate Sub GeneralDocumentCompleteEventHandler(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
    4. Public Sub New(GeneralDocumentCompleteEventHandler As WebBrowserDocumentCompletedEventHandler)
    5. AddHandler DocumentCompleted, GeneralDocumentCompleteEventHandler
    6. End Sub
    7. Private Sub DocumentCompleteEventHandler(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles MyBase.DocumentCompleted
    8. FullyLoaded = True
    9. 'weitere Sachen, die für diesen WebBrowser im speziellen passieren sollen
    10. End Sub
    11. End Class
    12. Private Sub DocumentCompleteEventHandler(sender As Object, e As WebBrowserDocumentCompletedEventArgs)
    13. 'Sachen, die für alle WebBrowser passieren sollen
    14. 'Sachen, die mit dem aufrufenden WebBrowserEx passieren sollen
    15. DirectCast(sender, WebBrowserEx).FullyLoaded = True
    16. 'Sachen, die für einen WebBrowser mit spezifischer URL passieren sollen
    17. If DirectCast(sender, WebBrowserEx).Url.ToString = "bla" Then
    18. End If
    19. End Sub
    20. Private Sub CreateNewWebBrowserEx()
    21. Dim WBE As New WebBrowserEx(AddressOf DocumentCompleteEventHandler)
    22. WBE.Navigate("www.google.de")
    23. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.