Leere Spalten und Zellen beschriften in DataGridView

  • VB.NET

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

    Leere Spalten und Zellen beschriften in DataGridView

    Hallo!

    Ich habe zwei Probleme mit dem DataGridView:

    1. Beim festlegen der Zeilenzahl entsteht eine leere Spalte, obwohl die Spalten festgelegt wurden. Es soll 6 Spalten geben, doch mit dem Befehl

    VB.NET-Quellcode

    1. DataGridView1.RowCount = Max
    wird vor der ersten Spalte eine leere Spalte hinzugefügt.

    2. Beim Versuch eine Zelle zu beschriften heißt es: "Der Ausdruck ergibt keinen Wert".

    VB.NET-Quellcode

    1. For i = 1 To Max
    2. DataGridView1.Item(1, Max).Selected = True
    3. DataGridView1.Select.text = i
    4. Next

    Die erste Spalte soll eine laufende Nr. erhalten.
    Der Index der Spalten und Zeilen ist Null basiert. Heißt die erste Spalte hat den Index 0 und die erste Zeile ebenso.

    Besser wäre es, das ganze aber in der dem DataGridView als Datenquelle hinterliegenden DataTable machen und nicht direkt im DataGridView.

    Dort ginge das so:
    myDataTable.Rows(0)(0) = „Foo“
    "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
    So ganz habe ich das immer noch nicht raus. Ich habe erstmal myDataTable mit DataTable definiert und mit myDataTable = New DataTable initialisiert.

    Wenn nun MyDataTable.Rows(0)(0) = "Foo" ausgeführt werden soll, heißt es:
    Eine Ausnahme vom Typ "System.IndexOutOfRangeException" ist in System.Data.dll aufgetreten, doch wurde diese im Benutzercode nicht verarbeitet.

    Zusätzliche Informationen: An der Position 0 befindet sich keine Zeile.

    Nun wollte ich mit If Max > MyDataTable.Rows Then MyDataTable.NewRow() eine neue Zeile erzeugen. Doch dann heißt es:
    Der >-Operator ist für die Typen Integer und DataRowCollection nicht definiert.
    MyDataTable.Rows gibt die Zeilenansammlung zurück (DataRowCollection). Dein Vergleich ist wie: Wenn 5 > Teammitglieder, dann …. Du brauchst also die Anzahl der Rows/Teammitglieder, also If Max > MyDataTable.Rows.Count Then

    Allerdings ist die Codezeile DataGridView1.Select.text = i in Post#1 schon syntaktisch falsch, von daher frag ich mich grad, wie der echte Code aussieht …
    Außerdem ist die Problembeschreibung schon ein Problem für mich:

    Selter98 schrieb:

    Beim festlegen der Zeilenzahl entsteht eine leere Spalte, obwohl die Spalten festgelegt wurden. Es soll 6 Spalten geben, doch mit dem Befehl […] wird vor der ersten Spalte eine leere Spalte hinzugefügt.
    Das kann ich nicht bestätigen. Lege ich so die Zeilenanzahl fest, entsteht bei mir keine zusätzliche Spalte. Außerdem: Warum leere Spalte? Nach den hiesigen Angaben müssten alle Spalten leer sein. Daher die Frage: Wie sieht der tatsächliche Code aus? Und wie kommen die anscheinend vorhandenen Daten ins DGV?


    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.

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

    Selter98 schrieb:

    Beim festlegen der Zeilenzahl entsteht eine leere Spalte

    Ich glaube - Er meint vermutlich damit die Anfügezeile...
    Da soll er nochmals dazu genaue Angaben machen.

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

    Die Tabelle soll 6 Spalten enthalten:
    Abbildung1

    Nach der Anweisung DataGridView1.RowCount = Max sieht die Tabelle so aus:
    Abbildung2
    Vor der eigentlichen ersten Spalten kam eine leere Spalte dazu.

    Hier einmal der komplette Quellcode:

    VB.NET-Quellcode

    1. Dim Benutzer As String
    2. Dim Ini As New IniDatei
    3. Dim MyDataTable As DataTable
    4. Dim Geladen As Boolean
    5. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. Benutzer = "Neu"
    7. ComboBox1.Text = Monatsname(Now.Month)
    8. NumericUpDown1.Value = Now.Year
    9. End Sub
    10. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    11. DatenblattÖffnen()
    12. End Sub
    13. Private Sub NumericUpDown1_ValueChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.ValueChanged
    14. DatenblattÖffnen()
    15. End Sub
    16. Sub DatenblattÖffnen()
    17. Dim Dateiname As String
    18. Dim Max As Integer
    19. If Not Geladen Then
    20. MyDataTable = New DataTable
    21. Geladen = True
    22. End If
    23. Dateiname = My.Application.Info.DirectoryPath & "\Konten\" & Benutzer
    24. If Not My.Computer.FileSystem.DirectoryExists(Dateiname) Then
    25. My.Computer.FileSystem.CreateDirectory(Dateiname)
    26. End If
    27. Dateiname = My.Application.Info.DirectoryPath & "\Konten\" & Benutzer & "\" & ComboBox1.Text & NumericUpDown1.Value & ".ini"
    28. Ini.Pfad = Dateiname
    29. If Not My.Computer.FileSystem.FileExists(Dateiname) Then
    30. Ini.WertSchreiben("Zeilen", "Max", 1)
    31. End If
    32. Max = Val(Ini.WertLesen("Zeilen", "Max"))
    33. DataGridView1.RowCount = Max
    34. 'For i = 1 To Max
    35. 'DataGridView1.Item(0, Max - 1).Selected = True
    36. 'DataGridView1.Select.text = i
    37. 'If Max > MyDataTable.Rows Then MyDataTable.NewRow()
    38. 'MyDataTable.Rows(0)(0) = "Foo"
    39. 'Next
    40. 'DataGridView1.DataSource = MyDataTable
    41. End Sub


    Die letzten Zeilen wurden erstmal auskommentiert, da die Anzahl der Zeilen in myDataTable nicht gesetzt werden kann.
    Spekulatius: Wenn das DGV an die DataTable gebunden ist (ist aus dem Code nicht ersichtlich, weil er nicht vollständig ist), wird eine leere DataTable erzeugt. Und die versucht das DGV einzubinden. Die vorgegebenen Spalten sind für die DataTable wurscht. Die DataTable-Spalten (neue Table -> eine leere Spalte) werden dem DGV hinzugefügt.

    Bilder solltest Du forenintern über [+ Erweiterte Antwort] -> _|Dateianhänge|_ -> [Hochladen] posten. Nicht wenige (Power)User hier klicken ungern auf ImageHosterLinks und stellen stattdessen die Hilfe hier im Thread ein bzw. fangen gar nicht erst mit Hilfe an. Deine Entscheidung.
    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.