Index War ausserhalb des arraybereichs

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von xtts02.

    Index War ausserhalb des arraybereichs

    Hi, Ich habe ein Problem mit einer aausgabe zwischen vb und php auf dem server.
    Ichs ende ine Anfrage an mein php script dass mir aus meiner Datenbank Datensätze holt.
    Wenn ich die abfrage innerhalb Private Sub Form1_Load ausführe funktioniert das ganze reibungslos.
    Doch sobald die Abfrage mit einem senden über ein Button machen bekomme ich den Fehler "System.IndexOutOfRangeException"Der Index war Auserhalb des Arraybereichs".
    Der Code ist:

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim myWebClient As System.Net.WebClient
    5. myWebClient = New System.Net.WebClient()
    6. Dim phpResult As String
    7. Dim value As String
    8. value = "http://url zur website/Data/index.php?abfrage=normal"
    9. phpResult = myWebClient.DownloadString(value)
    10. Dim Stringlist As String = phpResult
    11. Dim arraylist() As String = Stringlist.Split("-")
    12. For i = 0 To arraylist.Length - 1
    13. 'ListBox1.Items.Add(arraylist(i))
    14. Dim val As String = arraylist(i)
    15. Dim list() As String = val.Split(":")
    16. With ListView1.Items
    17. Dim item As ListViewItem
    18. item = .Add(list(0))
    19. item.SubItems.Add(list(1))
    20. item.SubItems.Add(list(2))
    21. item.SubItems.Add(list(3))
    22. item.SubItems.Add(list(4))
    23. item.SubItems.Add(list(5))
    24. End With
    25. Next
    26. End Sub
    27. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    28. End Sub
    29. End Class


    *Topic verschoben, VB-BBCode eingefügt*
    Bilder
    • visual basic.png

      134,71 kB, 1.280×720, 181 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    1. Bitte VB-Tags benutzen
    2.
    Wenn ich die abfrage innerhalb Private Sub Form1_Load ausführe funktioniert das ganze reibungslos.

    Woher weißt Du, dass es funktioniert?
    Die Frage hört sich blöd an, ist aber extrem wichtig, weil Du hier was lernen kannst. Vergewissere Dich, dass Deine Annahmen korrekt sind. Wenn Du dann zu dem Schluss gekommen bist, dass...
    ... es in Form1_Load wirklich funktioniert...

    ... dann setze mal einen Haltepunkt auf das End Sub von Form1_Load und führe das Programm aus. Was sollte passieren? Was passiert? (Oder eher: was passiert nicht?) Was schließt Du daraus?

    ... es in Form1_Load doch nicht funktioniert...

    ... dann hast Du eine der Erfahrungen gemacht, die jeder irgendwann mal macht, wenn er mit WinForms anfängt. Exceptions werden im Form.Load-Ereignishandler verschluckt. Warum das so ist und in welchen Fällen das genau passiert, weiß ich leider nicht. Vielleicht können da andere Forumsmitglieder was konkretes zu sagen.
    Die sinnvollste Konsequenz ist, den Code woanders hin zu schieben. Hier bietet sich entweder der Konstruktor an (Public Sub New()) oder das Shown-Ereignis. Der Konstruktor wird ausgeführt, bevor das Fenster überhaupt erst mal angezeigt wird (ist ein ganz normaler Konstruktor halt). Das Shown-Ereignis wird ausgeführt, nachdem das Fenster zum ersten Mal angezeigt wurde.


    3. Bezüglich der Exception:
    Jo. Steht ja da. Der Index ist außerhalb des gültigen Bereiches. Guck Dir mal an, was denn in dem Array drin steht, aus dem Du das Element mit dem Index 0 (Edit: Index 1) herausholen willst.
    Den Umgang mit der IDE zu lernen, um solchen Problemen auf den Grund zu gehen, ist essenziell.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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

    1. falsches Unterforum gewählt, da VB.Net, nicht VBScript
    2. Laut Überwachung hat list eine Länge von 1, also 1 Item, und das hat den Index 0. Es gibt kein Item mit dem Index 1. Daher der Fehler. Schau einfach mal den Wert von val an. Da dürfte gar kein : auftauchen.
    3. Option Strict On, denn Split(":") ist falsch.
    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.
    das ist meine ausgabe die zrück kommt vom php script wenn ich es ohne button ausführe in Form_Load siehe bild 1


    Und das ist die Ausgabe wenn ich es Über Form_load ausführe in den Listview hier funktioniert es:
    Sobald ich die gleiche Ausgabe über meien Button mache funktioniert es nicht. Zwische den Datensätzen wird durch doppelpunkt und strich getrennt.
    Siehe Bild 2
    Bilder
    • ausgabe formload.png

      142,36 kB, 1.280×720, 154 mal angesehen
    • visual basic ablauf forload.png

      218,42 kB, 1.280×720, 136 mal angesehen
    Wenn Du das Ganze im Button_Click-EventHandler hast: Setze einen Haltepunkt bei Dim Stringlist As String = phpResult und sobald der Debugger dort ankommt und das Programm unterbricht, zeige mit der Maus auf phpResult, sodass angezeigt wird, welchen Wert phpResult hat. Ergibt jener konkrete Wert Sinn? Steht überhaupt was drin? Wenn ja, was?
    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.
    In der Werkzeugleiste oben gibt es einen Button mit einem blauen Pfeil, der nach unten auf ein graues Quadrat zeigt (4 rechts von einem Button mit einem roten Quadrat).
    Klicke auf den Button drauf, sobald der Haltepunkt erreicht wurde. Der Debugger springt so einen Schritt weiter. Überprüfe jetzt auch bei allen anderen Variablen, ob das, was drin steht, Sinn macht.
    Mach das so lange, bis Dir was auffällt, was nicht stimmt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @saris Es ist wohl so, dass Du der Meinung bist, dass Code, der compiliert, auch läuft.
    Das ist leider nicht so. Du musst Dich von jeder einzelnen Zeile Code überzeugen, dass sie das tut, was sie tun soll.
    Lerne zu debuggen: Debuggen, Fehler finden und beseitigen
    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!
    Hallo

    Für leute die über z.b. Google kommen wäre es super wenn du deinen Endgültigen Code Posten würdest mit der Info das er zum Ziel geführt hat.
    Das würdest DU dir vermutlich auch wünschen wenn du bei suchen nach einer Lösung hier her gelangst.
    Bie der Gelegenheit kannst du gleich mal das Thema als "erledigt" markieren. (Ganz oben beim Startpost)

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hier die verbesserte und Funktionierende Form des Codes.
    Mit dem Das Programm auch tadelos läuft.
    Wie ein andere user schon sagte

    Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ListView1.Items.Clear() <=erst einmal die anfrage zuvor leeren
    3. Dim myWebClient As System.Net.WebClient
    4. myWebClient = New System.Net.WebClient()
    5. Dim phpResult As String
    6. Dim value As String
    7. value = "http://exo2.000webhostapp.com/Data/index.php?abfrage=normal"
    8. phpResult = myWebClient.DownloadString(value)
    9. Dim arraylist() As String = phpResult.Split("-")
    10. For i = 0 To arraylist.Length - 2<=//hier stand eine eins also hatte mein wert eine 0
    11. Dim list() As String = arraylist(i).Split(":")
    12. With ListView1.Items
    13. Dim item As ListViewItem
    14. item = .Add(list(0))
    15. item.SubItems.Add(list(1))
    16. item.SubItems.Add(list(2))
    17. item.SubItems.Add(list(3))
    18. item.SubItems.Add(list(4))
    19. item.SubItems.Add(list(5))
    20. End With
    21. Next
    22. End Sub

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

    Super, Danke. Ein Tipp noch. Mach Option Strict ON. Siehe hier. Das wird dir in Zukunft noch viel Helfen.
    Damit läuft dein jetziger Code zwar nicht und müsste leicht umgeschrieben werden, aber dein Code wird in Zukunft besser.
    Aber ich gehe davon aus, das du eher nicht willst, denn vor mit wurde es ja auch bereits erwähnt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    meine PHP ausgabe ist diese hier

    Quellcode

    1. 22.10.2017:spannhülsen 6x 14:7896623:123665554:alko:nein-21.10.2017:Spannhülse 6 x 10:56223:566993:alko:nein-23.11.2017:gleitrollen:8236000:555556666:AlKo:ja-20.11.2017:test:005693002:0002233:alko:nein-

    die trennung zwischen der spalte in der Datenbank erfolgt durch ein Bindestrich und dei trennung der jeweiligen daten der ware erfolgt durch ein doppelpunkt.
    aus diesen werten versuche ich ein array zu machen da diese datensätze aus einer php datei geholt werden.
    So hier ist nun der Option Strict On und der split auf char

    Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ListView1.Items.Clear()
    3. Dim myWebClient As System.Net.WebClient
    4. myWebClient = New System.Net.WebClient()
    5. Dim phpResult As String
    6. Dim value As String
    7. value = "http://exo2.000webhostapp.com/Data/index.php?abfrage=normal"
    8. phpResult = myWebClient.DownloadString(value)
    9. Dim arraylist() As String = phpResult.Split(CType("-", Char()))
    10. For i = 0 To arraylist.Length - 2
    11. Dim list() As String = arraylist(i).Split(CType(":", Char()))
    12. With ListView1.Items
    13. Dim item As ListViewItem
    14. item = .Add(list(0))
    15. item.SubItems.Add(list(1))
    16. item.SubItems.Add(list(2))
    17. item.SubItems.Add(list(3))
    18. item.SubItems.Add(list(4))
    19. item.SubItems.Add(list(5))
    20. End With
    21. Next
    22. End Sub

    phpResult.Split(CType("-", Char())) lässt sich zu phpResult.Split("-"c) verkürzen
    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.