Auf Event warten?

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von iluvdemon.

    Auf Event warten?

    Hallo liebe community!

    Ich habe mich schon öfters gefragt ob es einen Befehlt gibt mit dem man innerhalb von einem(!) sub auf ein Event warten kann, siehe folgender fakecode:


    webbrowser.navigate("url")
    waitforevent WebBrowser.DocumentCompleted
    msgbox("Done!")


    LG!
    ja, aber dann so:

    VB.NET-Quellcode

    1. webbrowser.navigate("url")
    2. While WebBrowser.IsBusy
    3. Threading.Sleep(100)
    4. End While
    5. msgbox("Done!")

    somit bleibt das ganze stehen, deshalb solltest du es in einen extra Thread, bzw. Backgroundworker packen...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Vielen Dank für die Antwort!

    Das habe ich schon probiert, in meiner Anwendung habe ich statt der msgboxzeile:

    VB.NET-Quellcode

    1. Dim Source As String = WebBrowser.Document.Body.InnerText


    Und wenn ich das so mache wie du es vorgeschlagen hast, bekomme ich "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

    Es klappt nur wenn ich "Dim Source... " im "Handles WebBrowser.DocumentCompleted" habe...


    Interessant wäre es jedoch wenn man auf jeden Event warten könnte :rolleyes: (also nicht nur Webbrowser Events)

    LG!
    Hallo iluvdemon,

    der Kotzfaktor ist hier wieder mal ziemlich hoch.

    Es gibt keinen Grund auf das Ende des Seitenladens zu warten.

    Das Webbrowser-Control bietet dir dafür ein eigenes Event an.

    VB.NET-Quellcode

    1. Private Sub wb_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted
    2. End Sub


    Gruss

    mikeb69
    @mikeb69: das ist natürlich völlig richtig :P, die Antwort hab ich trotzdem gepostet...

    @TE: für die Fehlermeldung wäre es natürlich nicht schlecht gewesen, in welcher Zeile es stattfindet, aber ich weiß es jetzt auch selber...
    statt Threading.Sleep musst du Threading.Thread.Sleep verwenden...

    aber Allgemein ist das echt nicht schön :P
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke für eure Antworten,

    @mikeb69: in meinem letzten Beitrag habe ich darauf hingewiesen dass es bei mir nur so funktioniert wie du es eben vorgeschlagen hast x.x

    @jvbsl: ist schon klar das threading.sleep nich einfach so stehen kann : D


    Ich schildere jetzt meinen Ablauf, vielleicht gibt es da ein Workaround:

    VB.NET-Quellcode

    1. public function Query2DGV(byval querystring as string) as datagridview
    2. 'Erstellt lokale .php Datei mit QueryString und ladet diese per FTP hoch
    3. File.WriteAllText(LocalFile, str)
    4. client.UploadFile(New Uri(FTPFile), LocalFile)
    5. 'WebBrowser navigate/refresh
    6. WebBrowser.Navigate(HTTPFile)
    7. WebBrowser.Refresh()
    8. end function
    9. Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser.DocumentCompleted
    10. 'hier wird der InnerText geparst, und in ein Temporäres Datagridview eingesetzt, das soll jedoch bei der Funktion Query2DGV returnt werden..
    11. end sub


    Ich hoffe es ist verständlich so wie ich es beschrieben habe x.x
    Es wird also eine .php Datei erstellt die einen php code beinhaltet. Diese wird hochgeladen, und anschließend im Webbrowser ausgeführt, so dass der Server diesen php code bearbeitet und das Ergebnis im Webbrowser ausgibt.
    Der InnerText des Webbrowsers wird anschließend geparst, und in ein Temporäres DGV eingesetzt, dieses soll dann in der Funktion returnt werden.

    LG!


    EDIT:
    Habe es nun so gelöst:

    VB.NET-Quellcode

    1. Dim WebBrowserCompleted As Boolean = False
    2. Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser.DocumentCompleted
    3. WebBrowserCompleted = True
    4. End Sub


    In der Funktion dann:

    VB.NET-Quellcode

    1. Do
    2. System.Threading.Thread.Sleep(100)
    3. Application.DoEvents()
    4. Loop While WebBrowserCompleted = False
    5. WebBrowserCompleted = False



    Ist zwar nicht besonders schön, funktioniert aber!
    So ein WaitforEvent wäre trotzdem angenehm...

    LG!

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

    Hallo iluvdemon,

    in meinem letzten Beitrag habe ich darauf hingewiesen dass es bei mir nur so funktioniert wie du es eben vorgeschlagen hast

    was hindert dich dann daran diesen Weg zu gehen.
    Zumal es auch der einzig sinnvolle Weg ist. ;)

    Das hier

    VB.NET-Quellcode

    1. Do
    2. System.Threading.Thread.Sleep(100)
    3. Application.DoEvents()
    4. Loop While WebBrowserCompleted = False
    5. WebBrowserCompleted = False

    hat einen mindestens ebenso hohen Kotzfaktor.

    Vorschlag:
    Du Änderst deine Funktion in eine Sub um und bearbeitest deinen InnerText im DocumentCompleted Event.

    Gruss

    mikeb69
    und wieso es davor wohlmöglich funktioniert hat, du hast auf System.Windows.Forms.WebBrowser zugegriffen, was jedoch sicher nicht instanziert wurde. Hättest du den Browser auf deine Form gezogen hat der einen anderen namen wie z.B. WebBrowser1 und da kannst du dann auch auf den Dokument Text zugreifen.
    doch, eben schon - es war ganz sicher instanziert, darum hab ich mich ja auch über die Fehlermeldung gewurndert..

    ich habe den code nicht aus VB rauskopiert sondern hier selber reingeschrieben.. sehe "WebBrowser" also als den eigentlichen namen - sry hätte der Verständlichkeit wegen einen richtigen Namen nehmen sollen..

    LG!