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:
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
Dim Source AsString= 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 (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
PrivateSub wb_DocumentCompleted(ByVal sender AsObject, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted
@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
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
publicfunction Query2DGV(byval querystring asstring) as datagridview
'Erstellt lokale .php Datei mit QueryString und ladet diese per FTP hoch
File.WriteAllText(LocalFile, str)
client.UploadFile(New Uri(FTPFile), LocalFile)
'WebBrowser navigate/refresh
WebBrowser.Navigate(HTTPFile)
WebBrowser.Refresh()
endfunction
PrivateSub WebBrowser_DocumentCompleted(ByVal sender AsObject, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser.DocumentCompleted
'hier wird der InnerText geparst, und in ein Temporäres Datagridview eingesetzt, das soll jedoch bei der Funktion Query2DGV returnt werden..
endsub
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
Dim WebBrowserCompleted AsBoolean=False
PrivateSub WebBrowser_DocumentCompleted(ByVal sender AsObject, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser.DocumentCompleted
WebBrowserCompleted =True
EndSub
In der Funktion dann:
VB.NET-Quellcode
Do
System.Threading.Thread.Sleep(100)
Application.DoEvents()
LoopWhile WebBrowserCompleted =False
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
Do
System.Threading.Thread.Sleep(100)
Application.DoEvents()
LoopWhile WebBrowserCompleted =False
WebBrowserCompleted =False
hat einen mindestens ebenso hohen Kotzfaktor.
Vorschlag:
Du Änderst deine Funktion in eine Sub um und bearbeitest deinen InnerText im DocumentCompleted Event.
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.
Zum "warten" gibt's übrigens das WAITHANDLE ... Am einfachsten in der Form des AutoResetEvent.
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..