Daten in Datagridview speichern und lesen

  • VB.NET

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

    Daten in Datagridview speichern und lesen

    Guten Tag!
    Ich möchte gerne Daten (eigentlich nur vom Typ Double, bzw Integer) in ein Datagridview (DGV) schreiben und abspeichern. Als absoluter Neuling in Sachen Datenbank habe ich mich für die von ErfinderdesRads vorgestellte Methode (Daten speichern und lesen mittels .xml -Datei) entschieden. Mein Code sieht nun so aus:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private _Datafile As New FileInfo("c:\users\ebi\Desktop\Dataset1.xml")
    5. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    6. ' DGV1.DataSource = "c:\users\ebi\Desktop\Dataset1.xml"
    7. DGV1.Columns.Add("cJahr", "Jahr")
    8. DGV1.Columns.Add("cGas", "Gas")
    9. DGV1.Columns.Add("cStromG", "Strom gesamt")
    10. DGV1.Columns.Add("cStromHT", "Strom HT")
    11. DGV1.Columns.Add("cStromNT", "Strom NT")
    12. DGV1.Columns.Add("cWasserG", "Wasser gesamt")
    13. DGV1.Columns.Add("cWasserHaus", "Wasser Haus")
    14. DGV1.Columns.Add("cWasserGarten", "Wasser Garten")
    15. ' Breite einstellen
    16. DGV1.Width = 85 * (DGV1.Columns.Count)
    17. DGV1.Height = 600
    18. DGV1.Columns("cJahr").Width = 65
    19. DGV1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    20. DGV1.Columns("cJahr").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    21. For i = 1 To DGV1.Columns.Count - 1
    22. DGV1.Columns(i).Width = 60
    23. DGV1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
    24. DGV1.Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
    25. Next
    26. For i = 0 To 10
    27. Dim Jahr As Integer = 1985 + i
    28. ' DGV1.Rows.Add()
    29. DGV1.Rows.Add(Jahr.ToString)
    30. Next
    31. End Sub
    32. Private Sub MenuStrip1_MenuClicked(ByVal Sender As Object, ByVal e As EventArgs) _
    33. Handles SaveToolStripMenuItem.Click, ReloadToolStripMenuItem.Click
    34. Select Case True
    35. Case Sender Is SaveToolStripMenuItem
    36. Save()
    37. Case Sender Is ReloadToolStripMenuItem
    38. Reload()
    39. End Select
    40. End Sub
    41. Private Sub Reload()
    42. DataSet1.Clear()
    43. If _Datafile.Exists Then
    44. Console.Beep(800, 200)
    45. DataSet1.ReadXml(_Datafile.FullName)
    46. End If
    47. End Sub
    48. Private Sub Save()
    49. Console.Beep(400, 200)
    50. Me.Validate()
    51. DataSet1.WriteXml(_Datafile.FullName)
    52. End Sub
    53. End Class


    DGV wird zwar wie gewünscht angezeigt, aber das Speichern gelingt nicht. Es wird zwar bei <save> eine .xml-Datei angelegt, aber die scheint leer zu sein. Der Versuch, die .xml-Datei als Datasource anzugeben, schlug fehl. Da kann ich nicht mal mehr die einzelnen Zeilen im DGV darstellen.
    Vermutlich geht das doch alles viel schwieriger, als gedacht.
    Wer kann mir bitte ein bisschen auf die Sprünge helfen?
    Vielen Dank!
    el
    Hast Du Dataset und Bindingsource angelegt? Ist die Bindingsource als Datasource für das Datagridview angegeben?
    Wenn ja, dann führt statt

    VB.NET-Quellcode

    1. DGV1.DataSource = "c:\users\ebi\Desktop\Dataset1.xml"
    ein

    VB.NET-Quellcode

    1. Reload()
    im Form_Load-Event sicher zum Erfolg.
    hier noch ein Denkansatz:
    Die Daten aus der .xml lädst Du Dir in eine DataTable und diese stellt dann die DataSource für Dein DGV1 dar. Mit der DataTable kannst Du dann arbeiten und das DGV zeigt es Dir an.
    Gruß & ...
    Lächle heut, morgen wird's schlimmer !!!

    Buch lesen | Bitte VB Tags benutzen - was ist damit gemeint? |

    VB-and-Me schrieb:

    habe ich mich für die von ErfinderdesRads vorgestellte Methode (Daten speichern und lesen mittels .xml -Datei) entschieden.

    Ähm - dann müssteeste aber deine Form_Load - Methode komplett entfernen.

    Stattdessen die DataTable aus dem Datenfenster aufs Form ziehen, und dann im Designer das daraufhin entstandene DataGridView bisserl nacharbeiten. gugge "DatasetOnly" auf Movie-Tuts
    Guten Tag!
    Nochmals Danke allen, die mir geschrieben haben.
    Ich habe die Methode von Erfinderdes Rads weiterverfolgt und auch das empfohlene Tutorial gelesen, aber so recht geht es nicht weiter:
    Angelegt habe ich ein Dataset und Datatable mit 4 Reihen (Jahr, Gas, Strom, Wasser).


    Der Code ist nun reduziert auf:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private DS As New DataSet1
    5. Private _Datafile As New FileInfo("Energie.xml")
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. End Sub
    8. Private Sub MenuStrip1_MenuClicked(ByVal Sender As Object, ByVal e As EventArgs) _
    9. Handles SaveToolStripMenuItem.Click, ReloadToolStripMenuItem.Click
    10. Select Case True
    11. Case Sender Is SaveToolStripMenuItem
    12. Save()
    13. Case Sender Is ReloadToolStripMenuItem
    14. ReloadDVG()
    15. End Select
    16. End Sub
    17. Private Sub ReloadDVG()
    18. If _Datafile.Exists Then
    19. DS.Clear()
    20. Console.Beep(800, 200)
    21. DS.ReadXml(_Datafile.FullName)
    22. End If
    23. End Sub
    24. Private Sub Save()
    25. Console.Beep(400, 200)
    26. Me.Validate()
    27. DS.WriteXml(_Datafile.FullName)
    28. End Sub
    29. End Class


    Kann mir EdR bitte weiterhelfen?

    @us4711: "Hast Du Dataset und Bindingsource angelegt? Ist die Bindingsource als Datasource für das Datagridview angegeben?"
    Gibt es irgend ein kleines Programm, wo man das als Anfänger Schritt für Schritt lernen kann? Die hier genannten Tutorials sind für mich zu kompliziert. Wie lege ich ein Dataset, ein Datatable an?

    Vielen Dank!
    el
    Guten Tag! Mit dem Designer konnte ich nun sehr gut das Programm erstellen. Jetzt wollte ich das gleiche nochmals selbst mit eigenem Code versuchen. Mein Code sieht derzeit wie folgt aus:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form2
    4. Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    5. Dim DS = New DataSet
    6. Dim DT = New DataTable
    7. DT.Columns.Add(New DataColumn("Jahr", Type.GetType("System.Int32")))
    8. DT.Columns.Add(New DataColumn("Gas", Type.GetType("System.Int32")))
    9. DT.Columns.Add(New DataColumn("Strom gesamt", Type.GetType("System.Int32")))
    10. DT.Columns.Add(New DataColumn("Strom NT", Type.GetType("System.Int32")))
    11. DT.Columns.Add(New DataColumn("Strom HT", Type.GetType("System.Int32")))
    12. DT.Columns.Add(New DataColumn("Wasser gesamt", Type.GetType("System.Int32")))
    13. DT.Columns.Add(New DataColumn("Wasser Garten", Type.GetType("System.Int32")))
    14. DS.Tables.Add(DT)
    15. DataGridView1.DataSource = DT ' liegt hier der Fehler ???
    16. Label1.Text = DT.Columns.Count.ToString ' Anzahl der Spalten wird korrekt angezeigt
    17. Dim i As Integer
    18. For i = 0 To DataGridView1.Columns.Count - 1
    19. DataGridView1.Columns(i).Width = 65
    20. DataGridView1.Columns(i).ValueType = GetType(Integer)
    21. Next
    22. DataGridView1.Width = (DataGridView1.Columns.Count) * 65 + 85
    23. DataGridView1.Height = 500
    24. DataGridView1.Location = New Point(50, 70)
    25. ' das Datagridview wird mit seinen Spalten korrekt angezeigt
    26. Dim _datafile As New FileInfo("c:\users\ebi\desktop\Energie\MeineEnergieDat.xml")
    27. If _datafile.Exists Then
    28. DS.Clear()
    29. Console.Beep(800, 30) ' der Beepton ist zu hören
    30. DS.ReadXml(_datafile.FullName)
    31. Me.DataGridView1.Sort(Me.DataGridView1.Columns(0), System.ComponentModel.ListSortDirection.Descending) ' sortiert die Spalte (0) (hier Jahr) ab- oder aufsteigend
    32. End If
    33. End Sub
    34. End Class


    Dabei erscheinen die einzelnen Spalten des DataTables DT in der Datagridview korrekt. Allerdings funktioniert das nachfolgende Einlesen des .XML Datei nicht. Die Datei ist mit Daten gefüllt, der Beep-Ton ist zu hören. Die Daten werden aber nicht im DataGridview angezeigt. Das Programm bricht aber auch nicht ab.
    Wo bitte liegt mein Fehler?
    Vielen Dank!
    el
    Hey,

    wie sieht denn deine XML aus? Du musst dabei beachten, dass er ja nicht weiß was er lesen soll aus der XML.
    Eine XML musst du mit Knoten erstellen bzw durchlesen lassen.
    Ein einfaches:

    VB.NET-Quellcode

    1. ReadXml("meinexml.xml")


    geht nicht so einfach.

    Grüßle Marco
    Dein Code ist unvollständig bis fallig fölsch:
    1. Du erzeugst ein Dataset und eine Datatble. Diese Datatble bindest du an das Datagridview, ohne dass die Tabelle zu deinem Dataset gehört.
    2. Einlesen tust du die xml ins Dataset, welches nun seinerseits nix mit dem Datagridview am Hut hat.
    3. Du gibst dem DGV Spalten vor. Die sollen eigendlich von der gebundenen Datatable kommen tun. Nur die Tabelle weis, wie sie aussehen tut.

    Teste volgendes:
    1.Erstelle eine Datatable
    2. füge dieser Spalten mit Namens hinzu
    3. binde die mit Code an dein DGV
    Es sollten jetzt deine Spalten der Tabelle im DGV auftauchen.
    4. Fülle einige Reihen aus und...
    5. Speichere die Tabelle mit writexml und sieh dir die Datei an.
    6. Neuladen der Daten mit readxml
    Im nächsten Schritt kannst du nun die Tabelle dem Dataset adden und nun das Dataset speichern.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    ich weiß jetzt nicht sicher, worüber du nachlesen willst, aber falls du jetzt die nächsten paar Tage dich damit beschäftigst, wie man codeseitig ein Dataset aufsetzt, und ein DGV konfiguriert, bringe ich nochmal post#11 in Erinnerung: Ich halte das für keine gute Idee.

    ZB verbaust du dir mit diesem Selber-Bastel-Ansatz von vornherein die Möglichkeit, Databinding zu nutzen.
    Was wirklich eine Selbst-Behinderung darstellt, denn Databinding könnte dich unterstützen von den einfachsten Primitiv-Sachen bis zu kompliziertesten Anwendungs-Oberflächen (gugge 4Views).
    Hallo EdR!
    Das ist sehr sehr lieb, dass Du Dich nochmals um mich kümmerst. Natürlich werde ich Deine weiteren Links ansehen und auch die der anderen Experten. Ich sagte ja schon, dass mein kleines Programm, das ich mittels Deiner/Eurer Hilfen mit dem Designer geschrieben habe, für meine Bedürfnisse gut geht. Selbstverständlich werde ich Deine Ratschläge beim Programmieren beherzigen. Ich wollte eben jetzt nur verstehen, was da im Hintergrund abläuft. So habe ich jetzt gesehen, dass das Speichern einer XML-Datei auch ohne Dataset sondern nur mit Datatable auch geht. Siehe nachfolgender Code.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form2
    4. Public DT As New DataTable
    5. Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    6. DT.TableName = "TestDT"
    7. DT.Columns.Add(New DataColumn("Jahr", GetType(Integer)))
    8. DT.Columns.Add(New DataColumn("Gas", GetType(Integer)))
    9. DT.Columns.Add(New DataColumn("Strom gesamt", Type.GetType("System.Int32"))) ' das ist offensichtlich das gleiche wie Gettype(integer)
    10. DT.Columns.Add(New DataColumn("Strom NT", Type.GetType("System.Int32")))
    11. DT.Columns.Add(New DataColumn("Strom HT", Type.GetType("System.Int32")))
    12. DT.Columns.Add(New DataColumn("Wasser gesamt", Type.GetType("System.Int32")))
    13. DT.Columns.Add(New DataColumn("Wasser Garten", Type.GetType("System.Int32")))
    14. DataGridView1.DataSource = DT
    15. Dim i As Integer
    16. For i = 0 To DataGridView1.Columns.Count - 1
    17. DataGridView1.Columns(i).Width = 65
    18. DataGridView1.Columns(i).ValueType = GetType(Integer)
    19. Next
    20. DataGridView1.Width = (DataGridView1.Columns.Count) * 65 + 85
    21. DataGridView1.Height = 500
    22. DataGridView1.Location = New Point(50, 70)
    23. ' das Datagridview wird mit seinen Spalten korrekt angezeigt
    24. Call DatenLesen()
    25. End Sub
    26. Private Sub ProgrammBeenden() Handles ProgrammBeendenToolStripMenuItem.Click
    27. Application.Exit()
    28. End Sub
    29. ' ByVal sender As Object, ByVal e As System.EventArgs
    30. Private Sub DatenLesen() Handles DatenLesenToolStripMenuItem.Click
    31. DT.Clear()
    32. Dim _datafile As New FileInfo("c:\users\ebi\desktop\Energie\TestMeineEnergieDat.xml")
    33. DT.ReadXml(_datafile.FullName)
    34. End Sub
    35. Private Sub Speichern() Handles SpeichernToolStripMenuItem.Click
    36. Dim message As String = "---> Datei wirklich speichern?"
    37. Dim caption As String = "Achtung!"
    38. Dim result = MessageBox.Show(message, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    39. ' wenn der Nein - button gedrückt wird:
    40. If (result = DialogResult.No) Then Exit Sub
    41. Console.Beep(400, 30)
    42. Me.Validate()
    43. Dim _datafile As New FileInfo("c:\users\ebi\desktop\Energie\TestMeineEnergieDat.xml")
    44. DT.WriteXml(_datafile.FullName)
    45. End Sub
    46. End Class


    Mein Kardinalfehler- neben allen anderen - war wohl, dass ich als xml-DAtei die gleiche Datei genommen habe, die durch das mit dem Designer erstellte Programm verwendet wird. Ich wollte diese Datei in dem neuen Programm verwenden und einlesen, aber das geht wohl nicht. Oder gibt es dafür eine Lösung?

    Zum allgemeinen Verständnis: ich bin kein Programmierer, ich bin Rentern und beschäftige mich mit VB2010 nur aus Neugierde und weil ich früher mal ein bisschen mit Pascal und VB4 als Hobby gewerkelt habe. Große Programme werde ich sicherlich nie schreiben können. Wie Du Dir nun vorstellen kannst, stoße ich bei den hier und im Internet zu findenden Programmcodes sehr schnell an meine Grenzen. Ich versuche einfach die einfachsten Fragestellungen und Antworten nachzuvollziehen. Es wäre trotzdem schön, wenn Ihr mich hier weiterhin bei meinen gelegentlichen Anfragen unterstützen würdet. Ich könnte es aber auch verstehen, wenn Ihr Eure wertvolle Zeit nicht mit solchen Dilettanten verschwenden wollt.

    Nochmals ein herzliches Dankeschön
    el :)
    Also ich bin tendenziell sehr dafür, wenn Designer-Unterstützung gegeben ist (Ob nun Form-Designer oder Dataset-Designer oder noch was anneres), diese auch zu nutzen.
    Was man im Designer einstellt, braucht man im Code nicht mehr hinzuschreiben, und besonders die vielen Properties der vielen Spalten eines oder mehrerer Datagridviews können nur dann im Designer eingestellt werden, wenn das DGV an ein typisiertes Dataset gebunden ist.

    Um zu gucken, wie man dieselben Effekte auch codeseitig erzielt, ists am einfachsten, sie erstmal wie gehabt im Designer einzustellen, und dann die Form.Designer.vb - Datei zu öffnen - da steht nämlich der ganze Code drin, den der Designer generiert hat.