VB.NET Columns einer DataGridView speichern

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB.NET Columns einer DataGridView speichern

    Hallo Community!

    Ich habe mal wieder eine Frage an die VB-Experten unter euch: Ich habe eine kleine Funktion, mit der ich die DataGridView in ein DataTable umwandeln kann. Ich speichere sie dann als XML.
    Das funktioniert so weit super, doch beim laden der DGV stelle ich fest, dass die ColumnHeaders nicht gespeichert wurden ?( Dort steht
    jetzt nur "ColumnHeader 1" , "ColumnHeader 2" usw.
    Hier mein Code:

    DGV speichern:

    VB.NET-Quellcode

    1. Dim filename As String = "testfile"
    2. Dim DT As DataTable = GetDataTableFromDGV(DGV)
    3. DT.TableName = filename
    4. DT.WriteXml(My.Computer.FileSystem.SpecialDirectories.MyDocuments + "\" + filename + ".xml")


    DGV laden:

    VB.NET-Quellcode

    1. Dim DT As DataTable = GetDataTableFromDGV(DGV)
    2. Dim filename As String = My.Computer.FileSystem.SpecialDirectories.MyDocuments + "\" + filename + ".xml"
    3. DT.TableName = filename
    4. DT.ReadXmlSchema(filename)
    5. DT.ReadXml(filename)
    6. DGV.DataSource = DT


    und die Funktion zum Umwandeln:

    VB.NET-Quellcode

    1. Private Function GetDataTableFromDGV(dgv As DataGridView) As DataTable
    2. Dim dt = New DataTable()
    3. For Each column As DataGridViewColumn In dgv.Columns
    4. If column.Visible Then
    5. dt.Columns.Add()
    6. End If
    7. Next
    8. Dim cellValues As Object() = New Object(dgv.Columns.Count - 1) {}
    9. For Each row As DataGridViewRow In dgv.Rows
    10. For i As Integer = 0 To row.Cells.Count - 1
    11. cellValues(i) = row.Cells(i).Value
    12. Next
    13. dt.Rows.Add(cellValues)
    14. Next
    15. Return dt
    16. End Function


    Würde mich freuen, wenn jemand weiß, an was es liegt! :thumbsup:

    Übrigens: Das habe ich schon versucht: Bei dt.Columns.Add() : dt.Columns.Add(column) : Fehler: DataGridViewColumn kann nicht in DataColumn umgewandelt werden.

    Grüße
    afaik braucht man keine DGV->DataTable-Umwandlungsfunktion.
    Man kann doch einfach das DGV an die Datatable binden.
    Was du ja auch teilweise tust.

    jdfs. bei gebundener DataTable kann man die Datatable doch direkt abspeichern - ist doch iwie unsinnig, das DGV noch zusätzlich in eine andere DataTAble umzuwandeln.
    Also ich denke du meinst DGV.DataSource mit "gebunden".

    Mein Speichern-Code sieht dann so aus:

    VB.NET-Quellcode

    1. Dim filename As String = "testfile"
    2. Dim DT As New DataTable
    3. DGV.DataSource = DT
    4. DT.TableName = filename
    5. DT.WriteXml(My.Computer.FileSystem.SpecialDirectories.MyDocuments + "\" + filename + ".xml")


    Schaue ich dann aber in die xml-Datei sehe ich, dass keine Daten in ihr sind. Wahrscheinlich kann ich DataSource nur zum lesen benutzen.

    Vielleicht könntest du mir noch etwas genauer erklären, was ich zu tun habe, wäre zumindest sehr freundlich :thumbsup:

    Jannis22 schrieb:

    Also ich denke du meinst DGV.DataSource mit "gebunden".
    Ja, allerdings meine ich auch, das nur ein einziges mal zu machen, bevor noch Daten eingelesen oder gar eingegeben werden.

    Der Code zum Speichern sähe dann so aus:

    VB.NET-Quellcode

    1. Dim filename As String = "testfile"
    2. Dim DT = DirectCast(DGV.DataSource, DataTable)
    3. DT.WriteXml(My.Computer.FileSystem.SpecialDirectories.MyDocuments + "\" + filename + ".xml")
    Und an anderer Stelle wäre bereits lange vorher gebunden.
    @ErfinderDesRades Jou.
    @Jannis22 Wenn Du die DataTable richtig einrichtest, wird auch alles gespeichert.
    Sieh Dir mal dieses Beispiel an.
    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!