Index außerhalb des Arraybereiches?

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von SAR-71.

    Index außerhalb des Arraybereiches?

    Moin,

    bei meinem aktuellem Projekt arbeite ich viel mit dem DatagridView.
    Jedoch habe ich ein Problem. In der Zeile 6 bekomme ich die Ausnahme folgende Ausnahme: "Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.".
    Ich habe alles gecheckt, die Values sind ok und werden mir im Debugger auch richtig angezeigt.
    "ReadRSS" ist eine Funktion die 3 Parameter annimmt (zwei sind optional) - gibt es die Ausnahme möglicherweise in der Funktion? Wird dann im Debugger diese Zeile angezeigt?

    VB.NET-Quellcode

    1. If My.Settings.lastOne = "" Then
    2. Dim splited() As String
    3. With DataGridView1
    4. If .Rows.Count > 1 Then
    5. For i As Int16 = 0 To .Rows.Count - 3
    6. splited = Split(ReadRSS(.Rows(i).Cells(0).Value, , IIf(.Rows(i).Cells(1).Value = "", Nothing, .Rows(i).Cells(1).Value))(0), ":::::") 'Hier tritt der Fehler auf
    7. My.Settings.lastOne &= splited(0) & ":_:_:"
    8. Next
    9. splited = Split(ReadRSS(.Rows(.Rows.Count - 2).Cells(0).Value, , IIf(.Rows(.Rows.Count - 2).Cells(1).Value = "", Nothing, .Rows(.Rows.Count - 2).Cells(1).Value))(0), ":::::")
    10. My.Settings.lastOne &= splited(0)
    11. Else
    12. splited = Split(ReadRSS(.Rows(0).Cells(0).Value, , IIf(.Rows(0).Cells(1).Value = "", Nothing, .Rows(0).Cells(1).Value))(0), ":::::")
    13. My.Settings.lastOne = splited(0)
    14. End If
    15. End With
    16. End If
    (Sry, um 3 Uhr morgens mit Musik auf höchster Lautstärke neige ich dazu chaotisch zu programmieren. :P)



    Mfg.
    SAR

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SAR-71“ ()

    SAR-71 schrieb:

    chaotisch zu programmieren

    nun - dann bring zuerst das in Ordnung:
    mach erstmal Option Strict On!, und ersetze dann die von dir verwendeten veralteten Schrott-Methoden (zB IIF, Split) durch die aktuellen .Net-Methoden, du "Programmierer aus Leidenschaft" :thumbsup:
    zu den bösen Funktionen: böse Funktionen

    VB.NET-Quellcode

    1. If My.Settings.lastOne = "" Then
    2. Dim splited() As String
    3. With DataGridView1
    4. If .Rows.Count > 1 Then
    5. For i As Int16 = 0 To .Rows.Count - 3
    6. splited = ReadRSS(.Rows(i).Cells(0).Value, , If(.Rows(i).Cells(1).Value <> "", .Rows(i).Cells(1).Value))(0).Split(":::::") 'Hier tritt der Fehler auf
    7. My.Settings.lastOne &= splited(0) & ":_:_:"
    8. Next
    9. splited = ReadRSS(.Rows(.Rows.Count - 2).Cells(0).Value, , If(.Rows(.Rows.Count - 2).Cells(1).Value <> "", .Rows(.Rows.Count - 2).Cells(1).Value))(0).Split(":::::")
    10. My.Settings.lastOne &= splited(0)
    11. Else
    12. splited = ReadRSS(.Rows(0).Cells(0).Value, , If(.Rows(0).Cells(1).Value <> "", .Rows(0).Cells(1).Value))(0).Split(":::::")
    13. My.Settings.lastOne = splited(0)
    14. End If
    15. End With
    16. End If


    Hier auch mal der Header von meiner Funktion. Von der Funktion kommt keine Ausnahme. (Ist jetzt auch geprüft)

    VB.NET-Quellcode

    1. Public Function ReadRSS(ByVal URL As String, Optional ByVal lastValue As String = Nothing, Optional ByVal Filter As String = Nothing) As List(Of String)




    Mfg.
    SAR
    Bekomme ich nicht kompiliert - alle Zeilen mit dem If bekommen den Fehler, dass der erste Operand eines binären If ein Typ sein muss, der NULL-Werte zulässt.
    Abgesehen davon würde dann noch ein "CShort" in 5 Zeile kommen und ein "CStr" bei den binären Ifs.


    Mfg.
    SAR
    Ja und genau da ist das Problem.
    Anfangs ist vll. der Ganze quatsch den du da hast einfacher aber sobald du mehr als 200 Zeilen hast kommst du in teufels küche.
    Kurz: Option Strict On (und das IMMER), dann deine Fehler beheben und ERST dann hast du eine Basis.
    IndexOutOfRange heißt: Du hast ein Array mit Größe 10 und willst das 11. Element. -> Geht nicht, da es kein 11. gibt.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wenn ich Filter habe, dann sollen die Filter mitgegeben werden. Falls nicht, brauche ich Nothing.
    Und ich habe versucht den Code variable zu halten, damit ich via C&P die Zeile wiederverwenden kann.

    @thefiloe: Ne, ich dachte das der Fehler was anderes bedeutet. Aber danke für deine Aufklärung ...
    Wenn du meinen ersten Beitrag gelesen hättest, dann wüsstest du worum es geht. :P


    Mfg.
    SAR
    Schreib einfach ein paar mehr aber dafür deutlich kürzere Codezeilen, da findest Du den Fehler wesentlich schneller.
    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!
    Fehler gefunden.
    Die Funktion hat keine Einträge gefunden und Nothing zurückgeben. Dementsprechend war die List(of String) Nothing.

    Hab mich wohl zu sehr auf das DateGridView fixiert (der Code so hatte beim Testen mit einzelnen Werte funktioniert).



    Mfg.
    SAR

    SAR-71 schrieb:

    Wenn ich Filter habe, dann sollen die Filter mitgegeben werden. Falls nicht, brauche ich Nothing.
    ist das die Antwort auf meine Frage?
    Was sollen die Zeilen mit dem if eiglich bewirken?


    "Wenn ich Filter habe, dann sollen die Filter mitgegeben werden. Falls nicht, brauche ich Nothing." - ich sehe nix von einem Filter in deim Code - auch keine Variable, die "filter" heißt oder whatEver.

    ah - doch - jetzt habichs!
    Dieses Segment

    VB.NET-Quellcode

    1. ...If(.Rows(i).Cells(1).Value <> "", .Rows(i).Cells(1).Value)...
    soll einen Filter-String ergeben oder Nothing.
    das tutes aber ganz bestimmt nicht, da sind mehrere Syntax-Fehler drin.

    wieso packst du

    VB.NET-Quellcode

    1. .Rows(i).Cells(1).Value
    nicht in eine Variable, wie Rod vorgeschlagen?
    Da siehst du sicherlich gleich viel klarer, was anne Syntax nicht stimmt.

    edit: äh - wie jetzt: Fehler gefunden - Option Strict ist bei dir doch noch immer off, oder täusche ich mich?
    Ich habs wieder auf Off gestellt, den Fehler abgefangen und jetzt läuft alles erste Sahne.
    Außerdem habe ich so wieder mehr Übersicht (weil ich nicht überall "cXYZ" verwenden muss).

    Edit: Das mit dem Umstellen auf eine Variable werde ich aber noch umsetzen. ^^


    Mfg.
    SAR

    SAR-71 schrieb:

    Außerdem habe ich so wieder mehr Übersicht (weil ich nicht überall "cXYZ" verwenden muss).
    wenn du überall cXYZ verwenden zu müssen glaubst, machst du noch vieles falsch.
    Natürlich ersetzt man zunächstmal alle immanenten Typumwandlungen durch explizite Typumwandlungen, und dann sieht man erst mal, wie hässlich der Code ist.
    Dann aber macht man sich daran, von vornherein die richtigen Typen zu verwenden, sodass man keine Typumwandlungen mehr braucht, weil die Typen nämlich von vornherein zueinander passen.

    Und erst dann kannste sagen "es läuft erste Sahne" :thumbsup:

    VB.NET-Quellcode

    1. For i As Int16 = 0 To CShort(.Rows.Count - 3)
    den richtigen Typen nehmen:

    VB.NET-Quellcode

    1. For i As Integer = 0 To .Rows.Count - 3
    und noch kürzer:

    VB.NET-Quellcode

    1. For i = 0 To .Rows.Count - 3



    VB.NET-Quellcode

    1. If CStr(.Rows(i).Cells(0).Value) <> String.Empty Then
    Dassis einfach hässlich, weil du kein typisiertes Dataset verwendest, aber seis drum.

    du kannst dir eine zusätzliche RSSRead-Überladung schreiben, die gleich eine DatagridViewRow entgegennimmt. Dann wird dein Code zu:

    VB.NET-Quellcode

    1. With DataGridView1
    2. If .RowCount > 1 Then
    3. For i = 0 To .RowCount - 3
    4. splited = ReadRSS(.Rows(i))(0).Split(":::::") 'Hier tritt der Fehler auf
    5. My.Settings.lastOne &= splited(0) & ":_:_:"
    6. Next
    7. splited = ReadRSS(.Rows(.RowCount - 2))(0).Split(":::::")
    8. My.Settings.lastOne &= splited(0)
    9. Else
    10. splited = ReadRSS(.Rows(0))(0).Split(":::::")
    11. My.Settings.lastOne = splited(0)
    12. End If
    13. End With

    SAR-71 schrieb:

    SAR-71 schrieb:

    Ich habe alles gecheckt, die Values sind ok und werden mir im Debugger auch richtig angezeigt.

    SAR-71 schrieb:

    Fehler gefunden.
    Die Funktion hat keine Einträge gefunden und Nothing zurückgeben. Dementsprechend war die List(of String) Nothing.

    Hab mich wohl zu sehr auf das DateGridView fixiert (der Code so hatte beim Testen mit einzelnen Werte funktioniert).



    Mfg.
    SAR
    Zum Thema ich hab alles gecheckt. Wenn OutOfRange dortsteht, dann hast du eben nicht alles gecheckt :) :)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.