Indexfehler bei Datagridviewbefüllung und mehr als ein Datensatz in Tabelle

  • VB.NET

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

    Indexfehler bei Datagridviewbefüllung und mehr als ein Datensatz in Tabelle

    Hallo,

    ich hänge gerade an einem für mich kuriosen Problem. Ich habe eine Form mit einem Datagridview, das ich über eine SQL-Abfrage aus einer mysql-Datenbanktabelle befülle.
    Das Dategridview befülle ich beim Laden der Form.
    So lange nur ein Datensatz in der Tabelle ist, funktioniert das. Wenn ein zweiter Datensatz in die Datenbanktabelle dazu kommt, bekomme ich die Fehlermeldung: System.ArgumentOutOfRangeException: "Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein. Parametername: index"

    Als Stelle an der der Fehler auftritt wird die Zeile (im Listung Zeile 26).

    Quellcode

    1. .Rows(zeilen).Cells(0).Value = CStr(sqlRd("id"))

    angegeben, also wenn ich die Zellen im Datagridview adressiere und den Wert aus der Datenbankabfrage reinschreiben will.

    VB.NET-Quellcode

    1. Private Sub Form4_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim zeilen As Integer = 0
    3. sqlConn.ConnectionString = "server =" + server + ";" + "user id =" + username + ";" _
    4. + "password =" + password + ";" + "database =" + database
    5. sqlConn.Open()
    6. sqlCmd.Connection = sqlConn
    7. sqlCmd.CommandText = "SELECT * From fisms_user ORDER by nachname"
    8. sqlRd = sqlCmd.ExecuteReader
    9. With DataGridView1
    10. '.AllowUserToAddRows = False
    11. '.RowHeadersVisible = False
    12. .Columns.Clear()
    13. 'Spalten fürs DGV erstellen
    14. .Columns.Add("Spalte0", "ID")
    15. .Columns.Add("Spalte1", "Benutzername")
    16. .Columns.Add("Spalte2", "Vorname")
    17. .Columns.Add("Spalte3", "Nachname")
    18. .Columns.Add("Spalte4", "Recht")
    19. .Columns.Add("Spalte5", "Inaktiv")
    20. .Columns.Add("Spalte6", "PW-Fehler")
    21. .Columns.Add("Spalte7", "Letzter Login")
    22. MessageBox.Show("Zeilen: " + CStr(zeilen))
    23. While sqlRd.Read()
    24. .Rows(zeilen).Cells(0).Value = CStr(sqlRd("id"))
    25. .Rows(zeilen).Cells(1).Value = CStr(sqlRd("benutzername"))
    26. .Rows(zeilen).Cells(2).Value = CStr(sqlRd("vorname"))
    27. .Rows(zeilen).Cells(3).Value = CStr(sqlRd("nachname"))
    28. .Rows(zeilen).Cells(4).Value = CStr(sqlRd("recht"))
    29. .Rows(zeilen).Cells(5).Value = CStr(sqlRd("inaktiv"))
    30. .Rows(zeilen).Cells(6).Value = CStr(sqlRd("pw_fz"))
    31. .Rows(zeilen).Cells(7).Value = CStr(sqlRd("lastlogin"))
    32. zeilen = zeilen + 1
    33. End While
    34. End With
    35. sqlRd.Close()
    36. sqlConn.Close()
    37. sqlConn.Dispose()
    38. End Sub


    Kann mir jemand weiterhelfen?

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Wo wird denn festgelegt, wieviele Rows das DGV hat? Oder wo werden dem DGV Zeilen hinzugefügt? Steht nicht im Code.
    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.
    Naja, das kann ja nur rows sein, denn der Fehler kommt ja nur, wenn ich versuche eine weitere Zeile einzulesen.

    Ich habe es glaube ich gefunden. DGV.Rows.Add() ... teste es gleich mal

    Danke vorab.

    Bye
    Markus

    Edith: Ja funktioniert nun. Danke.

    Hab das Einzelschrittgeraffel jetzt in drei Zeilen zusammengefasst.

    VB.NET-Quellcode

    1. temp_row = CStr(sqlRd("id")) + "," + CStr(sqlRd("benutzername")) + "," + CStr(sqlRd("vorname")) + "," + CStr(sqlRd("nachname")) +
    2. "," + CStr(sqlRd("recht")) + "," + CStr(sqlRd("inaktiv")) + "," + CStr(sqlRd("pw_fz")) + "," + CStr(sqlRd("lastlogin"))
    3. row = temp_row.Split(","c)
    4. .Rows.Add(row)

    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Lord Luxor“ ()

    Ich würde das ganze DB Kommunikationsgeraffel in eine separate Klasse auslagern.

    Dort gibt es eine Funktion welcher man ein SQL Statement übergibt und eine gefüllte DataTable zurück bekommt. Diese kann man dann als Datenquelle einem DataGridView geben.

    Dann muss man das ganze Connections Zeug nämlich nur einmal Programmieren und nicht duzende Male.

    docs.microsoft.com/de-de/dotne…?view=dotnet-plat-ext-5.0

    docs.microsoft.com/de-de/dotne…adapter.fill?view=net-5.0
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Danke für den Tipp.
    Geht das nur mir so, oder sind die Microsoft Docs grauselig zu lesen?
    Ich werde mir das mal anschauen und für zukünftige Projekte vornehmen. Ich mache gerade erst meine ersten Laufversuche in VB.net und muss mir alles noch zusammensuchen, durchlesen und aneignen.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me

    Lord Luxor schrieb:

    Hab das Einzelschrittgeraffel jetzt in drei Zeilen zusammengefasst.

    VB.NET-Quellcode

    1. temp_row = CStr(sqlRd("id")) + "," + CStr(sqlRd("benutzername")) + "," + CStr(sqlRd("vorname")) + "," + CStr(sqlRd("nachname")) +
    2. "," + CStr(sqlRd("recht")) + "," + CStr(sqlRd("inaktiv")) + "," + CStr(sqlRd("pw_fz")) + "," + CStr(sqlRd("lastlogin"))
    3. row = temp_row.Split(","c)
    4. .Rows.Add(row)


    Oh - da kann man noch mehr machen.
    Mit String-Interpolation:

    VB.NET-Quellcode

    1. Dim temp_row = $"{sqlRd("id")},{sqlRd("benutzername")},{sqlRd("vorname")},{sqlRd("nachname")},{sqlRd("recht")},{sqlRd("inaktiv")},{sqlRd("pw_fz")},{sqlRd("lastlogin")}"
    2. .Rows.Add(temp_row.Split(","c))


    Oder gradezu intuitiv verständlich mit Linq:

    VB.NET-Quellcode

    1. Dim columnNames = "id benutzername vorname nachname recht inaktiv pw_fz lastlogin"
    2. Dim values = columnNames.Split.Select(Function(key) sqlRd(key))
    3. .Rows.Add(values.ToArray)
    Linq ist fürn Anfänger vlt. noch bischen fortgeschritten, aber wie man mit String-Interpolation Texte auf leidlich lesbare Weise zusammensetzt, sollteste dir aneignen.
    Ja am Anfang sind die nen bissl gruselig und für Anfänger schwer verständlich. Das gibt sich aber mit der Zeit.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Wenn mir die ersten Sätze in den MicDocs komisch vorkommen, schalte ich auf englisch um. Dann klärt sich die verschwurbelte Maschinenübersetzung.
    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.
    Ich finde die verlinkten Docs auch eine Überforderung für einen Anfänger.
    Ich denke, Lord Luxor hat noch nie vom .Net-Dataset gehört, und da kommt man ihm schon mittm DataAdapter.
    Natürlich Mega-grauselig - ich setz mich ja auch nicht inne Mathe-Vorlesung über Tensoren.
    Ich tät sogar drauf wetten, Lord Luxor steht noch auf Strict Off.
    (Und ich persönlich werde sowieso mittelfristig versuchen, ihm den Datenbank-Quatsch auszureden - aber das wird er derzeit schoma garnicht einsehen können.)

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

    Da haste schon recht :D
    Im Moment bin ich noch etwas überfahren von den Möglichkeiten und Tücken von .NET. Aber das wird noch.

    Nee nee, Option Strict ist on. Hatte aber die ersten Versuche mit off - bevor ich festgestellt hatte, dass ich hier auch diese Möglichkeit habe - und war dann überrascht, was .NET alles "verzeiht". Nach dem Einschalten hatte ich in einem kleinen Progrämmchen dann erstmal 150 Fehler zu beseitigen.

    Inwiefern Datenbank-Quatsch ausreden? Jetzt die aktuelle Technik die ich verwende? Oder wie meinst Du das?

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Jetzt die aktuelle Technik die du verwendest ist sowieso nixgutt. DB-Zugriffe sollten schon unbedingt über DataAdapter laufen - siehe Link, hahaha.
    Du hast jetzt bereits 50 - 100 Zeilen Code für sowas super-banales wie eine Tabelle von Daten abrufen und anzeigen.
    Jetzt kommt noch Ändern, Zufügen, Löschen - da bist du mit deim bisherigen Ansatz dann schnell mit 200-300 Zeilen unterwegs.
    Eine normale Datenverarbeitung tuts aber wohl kaum mit weniger als 10 Tabellen - dann bist du bei 2000-3000 Zeilen - für absolute Basic-Funktionalität!
    Und dann änder mal den Namen einer Spalte, füg eine hinzu, oder mach eine weg - da wirste verrückt - sowas nennt man: unwartbar :thumbdown: .

    Nee, da muss die vorgesehene fortgeschrittene Technologie gelernt werden - und die reicht auch noch nicht, sondern muss noch was schlaues generisches hinzuprogrammieren - aber wenn mans dann richtig auf die Schiene hat:
    Das alles(!) geht mit einem Einzeiler 8| !
    (Naja - zwei Einzeiler: Dataset.Fill(), Dataset.Save())



    Dann gibts da noch eine Technologie, von der du vmtl. noch nie gehört hast: Databinding.
    Also so 50 Zeilen schreiben, damit ein Datagridview wenigstens die Spalten anzeigt, die man sehen will - sowas braucht man nicht.
    Dafür sind Designer da, also das "Visual" am VisualStudio.
    Guggemol die vier Views auf Video
    Da sind auch lauffähige Sample-Solutions bei, ich glaub teilweise auch mit Laden und Abspeichern - aber ohne Datenbank.



    Womit ich schon das nächste Thema angefasst hab, aber ich mach hier nicht weiter, weil das geht immer schief, wenn ich zuviel Inhalt in einen Post tue.
    (Die 4Views sind übrigens eher ein Appetit-Macher, aber es gibt dort auch Links zu annere Tuts, die Dinge eingehender erklären.)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()