System.NullReferenceException

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von SWU.

    System.NullReferenceException

    Hallo Leute,


    Ich bin ein Anfänger und unten seht ist mein erstes VB-Programm. Schon nach drei Zeilen scheitere ich ...
    Der Text einer Webseite wird in die TextBox1 kopiert. Das funktioniert problemlos beim Event Button2_Click, wenn ich aber den
    Event WebBrowser1_ProgressChanged oder einen Timer-Event benutzen möchte, dann bekomme ich die System.NullReferenceException
    in der Zeile 15 TextBox1.Text = WebBrowser1.Document.Body.InnerText im Event-Handler.

    Wie löse ich das Problem? Und wenn Ihr Zeit habt: Könnt ihr mir erklären wie es zu Stande kommt? Vielen Dank!

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Windows.Forms
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. WebBrowser1.Navigate("www.ariva.de")
    6. End Sub
    7. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    8. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    9. End Sub
    10. Private Sub WebBrowser1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserProgressChangedEventArgs) Handles WebBrowser1.ProgressChanged
    11. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    12. End Sub
    13. End Class
    ?(
    ich denke, dass das Zustande kommt da du abfragst obwohl die Seite noch nicht vollständig geladen wurde.
    soweit ich weiß gibt es ein Event DocumentCompleted. Das wird ausgelöst wenn die Seite vollständig geladen wird.

    lg

    hier zur Fehlermeldung: MSDN
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Das WebBrowser1.ProgressChanged-Event sagt, welchen Anteil Du geladen hast, da könntest Du eine Progressbar mit füttern.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die wirklich schnellen Antworten

    Die Webseite enthält Daten, die permanent aktualisiert werden. Das würde heißen, dass Laden der Webseite ist grundsätzlich nie abgeschlossen ist.
    (sieht man auch an der Eigenschaft e.CurrentProgress).

    Unklar ist mir jedoch, wieso der dann Click-Event funktioniert. Der dürfte nach Eurer Argumentation auch nicht funktionieren, wenn die Webseite nicht vollständig geladen ist.
    Tut er aber einwandfrei, keine Fehlermeldung, die Daten werden in die Textbox kopiert.

    Weiterhin habe ich alternativ statt dem WebBrowser1.ProgressChanged-Event einen Timer-Event versucht, der die ebenfalls die System.NullReferenceException erzeugt.
    das legt die Vermutung nahe, das das Problem nicht speziell mit dem WebBrowser1.ProgressChanged-Event zusammenhängt.

    Was sagt ihr?

    Grüße Stefan
    hab deinen code 1:1 kopiert.
    Bei funktioniert es ohne Fehler (ausser es wurde die seite noch gar nicht geladen (dh. Webbrowser fenster leer))

    Probier es mal so:

    VB.NET-Quellcode

    1. Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    2. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    3. End Sub
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Stimmt. Ich habe nicht den richtigen link in der Webseite angegeben. Sorry.

    WebBrowser1.Navigate("www.ariva.de/dax-30")

    Auf der Webseite muss Du den Button "Push starten" drücken, dann werden die Daten aktualisiert und der Fehler tritt auf.
    Entschuldigung für den inkorrekten Quellcode!

    Gruß Stefan.
    zum zweiten mal...

    machs einfach so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. WebBrowser1.Navigate("www.ariva.de/dax-30")
    3. End Sub
    4. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    5. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    6. End Sub
    7. Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    8. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    9. End Sub


    da wird jedes mal wenn die seite neu geladen wird (durch den push knopf da) gewartet bis die seite vollständig geladen wurde.
    Erst dann wird der Body.InnterText abgefragt und somit kann keine System.NullReferenceException auftreten

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Danke für die Antwort. Ziel des Programmes soll sein, die Daten in TextBox1 ständig aktuell zu halten.
    Nur um sicher zu gehen, der Quellcode sieht jetzt so aus:

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Windows.Forms
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. WebBrowser1.Navigate("www.ariva.de/dax-30")
    6. End Sub
    7. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    8. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    9. End Sub
    10. Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    11. TextBox1.Text = WebBrowser1.Document.Body.InnerText
    12. End Sub
    13. End Class


    Die Daten in der Textbox1 werden nur einmal geladen und werden nicht ständig aktualisiert.
    Das sollte ja der Sinn des Einsatzes des Timer-Events bzw. des ProgressChanged-Events sein (ständige Aktualisierung der Textbox1, entweder einmal pro Sekunde oder solange die WebSeite geladen wird.)

    Mit dem DocumentCompleted-Event tritt zwar der Fehler nicht auf, aber der Programm erfüllt auch seine Funktion nicht.

    Viele Grüße, Stefan
    ich habe 5-10 mal hintereinander die textbox per hand gelöscht und gewartet bis der push da wieder neu ladet und mir wurde die TextBox jedes mal neu befüllt

    den timer kannst dir ja im grunde schenken da das event immer anschlägt wenn die Seite neu gealden wird
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Hallo wieder!

    Nimmst Du exakt den oben gelisteten Quellcode?
    Bei mir aktualisiert sich nichts nach dem ersten Laden, auch nicht beim Löschen per Hand.
    Ich will den Push natürlich nur einmal morgens bei Börsenbeginn aktivieren, danach soll das Programm kontinuierlich die Kursdaten in eine Datenbank schreiben.

    Nebenschauplatz: Hast Du den Fehler reproduzieren können? Falls ja: Hast Du eine Erklärung dafür, wieso der Click-Event geht, aber ein Timer-Event nicht?
    Die Ursache scheint ja die zu sein, das das Object Webbrowser1 der Wert "Nothing" besitzt solange die Webseite nicht vollständig geladen ist.
    In diesem Fall sollte der Click-Event aber auch zur Fehlermeldung führen.

    Viele Grüße, Stefan.
    Ja bis auf die imports oben.
    Hab das 1x geklickt (push) und hab nachdem er geladen hat per hand die textbox geleert.
    Kurz darauf stand wieder was drinnen (als es neu geladen wurde durch das push.der timer prüft schätz ich zu früh. Wenn du zuerst button1 für den navigate drückst und gleich drauf button2 müsste der fehler auch kommen.

    Lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Also vielen Dank für die viele Mühe, die Du Dir gemacht hast.
    Mit der Lösung bin ich noch nicht zufrieden, da ich gerne mit einem Timer arbeiten möchte.
    Ich habe jetzt selbst einen WorkAround gefunden: Ich nutze einen Tastatur-Event, der von einem Timer ausgelöst wird.
    Dann kommt die Fehlermeldung nicht.

    Warum die Fehlermeldung beim Tastatur-Event nicht kommt ist weiterhin unklar. Deshalb werde ich nochmal im Hauptform fragen.

    Viele Grüße, Stefan