none
Mehrdimansionales Array speichern RRS feed

  • Frage

  • Hallo Community,

    ich beschäftige mich zurzeit in Visual Studio Community 2015 mit VB.NET und der WindowsApplication und wollte nun ein mehrdimensionales Array speichern und wieder auslesen, komme aber nicht weiter. Mit einem eindimensionalen Array klappt das allerdings super.

    Beim ersten Start sollen Daten in das Datagridview mit 5 Columns eingetragen werden.

    Diese Daten sollen dann als Array gespeichert werden und beim nächsten öffnen wieder im Datagridview angezeigt werden.

    Man könnte das natürlich auch als Datenbank machen, aber damit kenne ich mich leider noch nicht aus.

    Es wäre schön, wenn mir jemand dabei helfen könnte bzw. mir einen Denkanstoß geben kann.

    MfG Steven -

    Dienstag, 18. August 2015 11:41

Antworten

  • Vielen Dank für die Antworten und die hilfreichen Links.

    Ja ich habe mir bereits Bücher bestellt, damit ich mich damit ordentlich beschäftigen kann.

    Ich werde es mit der Liste und mit dem 2D Array ausprobieren, so lerne ich gleich noch ein wenig mehr.


    Die Spaltenanzahl ist absolut, aber die Zeilenanzahl variiert.

    Ich habe das jetzt so gelöst:

    Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click Using rdr As New StreamReader(file, FileMode.Open) Dim lines() As String = System.IO.File.ReadAllLines(file) Dim i As Integer = (UBound(lines) - 1) / 5 dgv.Rows.Add(i) For zeile = 1 To Me.dgv.RowCount For spalte = 1 To Me.dgv.ColumnCount Me.dgv.Item(spalte - 1, zeile - 1).Value = rdr.ReadLine Next Next End Using End Sub

    Könnten dabei eventuell Probleme auftreten?

    Mit freundlichen Grüßen

    Steven - M

    Mittwoch, 19. August 2015 10:23

Alle Antworten

  • Hallo Steven,

    da du von einem DataGridView schreibst, gehe ich mal davon aus, dass du Windows Forms verwendest. Die erste Frage ist, in welcher Form du die Daten ablegen möchtest. Einfach wäre beispielsweise eine CSV Datei, wo die Elemente auf einer Zeile durch ein Trennzeichen (beispielsweise ein Semikolon) getrennt sind. Um das zu erreichen kannst du mit 2 verschachtelten For-Schleifen über das Array gehen und alles in einen StreamWriter schreiben.

    Ich weiß nicht wie viel du von den Themen schon kennst - alles erklären kann ich aber auch nicht da es auch sehr komplexe Themen sind. Daher hier ein paar Links:
    How to: Write Text to Files with a StreamWriter in Visual Basic
    Using System.IO.StreamWriter to write another line

    Beim wieder einlesen musst du nun genau anders herum vorgehen. Du liest Zeichen für Zeichen ein und sobald du ein Trennzeichen oder Zeilenumbruch gefunden hast, musst du ins nächste Element wechseln. Ein Beispiel findest du hier: VB Reading a text file into a 2D array?

    Ich würde übrigens kein 2D Array nutzen sondern eine eigene Klasse für einen Datensatz erstellen und dann eine Liste davon serialisieren. Das hat die Vorteile, dass die Spalten im DGV einfach gebunden werden können und das man einfacher und Fehlersicherer auf die einzelnen Spalten(/Zellen) zugreifen kann.Auch ist das (de)serialisieren in je 3 Zeilen erledigt. Ich kann dir aber nur empfehlen dich näher mit dieser Thematik auseinander zu setzen.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 18. August 2015 13:56
    Moderator
  • Hi Steven,
    das Hauptproblem beim Speichern von Daten und Weidereinlesen ist die Zuordnung, in Deinem Fall die Zuordnung zur Zelle im DataGridView. Solange eine Ausdehnung fest ist (z.B. Spaltenzahl), kann man alle Zellinhalte zeilenweise speichern und wieder lesen. Wenn das Programm jedoch die genaue Menge nicht kennt, benötigt man in der Datei Kennzeichen, um zweifelsfrei die Zuordnung beim Einlesen zu rekonstruieren.

    Mit Deinen 5 Spalten könnte das so aussehen:

    Imports System.IO Public Class Form02 Private dgv As New DataGridView With {.Dock = DockStyle.Fill, .ColumnCount = 5, .RowCount = 10} Private btnSave As New Button With {.Text = "Speichern", .Dock = DockStyle.Bottom} Private btnClear As New Button With {.Text = "Löschen", .Dock = DockStyle.Bottom} Private btnLoad As New Button With {.Text = "Laden", .Dock = DockStyle.Bottom}

    Private Sub Form02_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.Controls.AddRange(New Control() {btnLoad, btnClear, btnSave, dgv}) AddHandler Me.btnLoad.Click, AddressOf btn_load AddHandler Me.btnClear.Click, AddressOf btn_clear AddHandler Me.btnSave.Click, AddressOf btn_save For zeile = 1 To Me.dgv.RowCount For spalte = 1 To Me.dgv.ColumnCount Me.dgv.Item(spalte - 1, zeile - 1).Value = String.Format("Zelle {0} {1}", zeile, spalte) Next Next End Sub Private Sub btn_save(sender As Object, e As EventArgs) Using wrt As New StreamWriter("c:\temp\x.x", FileMode.Create) For zeile = 1 To Me.dgv.RowCount For spalte = 1 To Me.dgv.ColumnCount wrt.WriteLine(Me.dgv.Item(spalte - 1, zeile - 1).Value) Next Next End Using End Sub

    Private Sub btn_clear(sender As Object, e As EventArgs) For zeile = 1 To Me.dgv.RowCount For spalte = 1 To Me.dgv.ColumnCount Me.dgv.Item(spalte - 1, zeile - 1).Value = "" Next Next End Sub Private Sub btn_load(sender As Object, e As EventArgs) Using rdr As New StreamReader("c:\temp\x.x", FileMode.Open) For zeile = 1 To Me.dgv.RowCount For spalte = 1 To Me.dgv.ColumnCount Me.dgv.Item(spalte - 1, zeile - 1).Value = rdr.ReadLine Next Next End Using End Sub End Class



    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks



    Dienstag, 18. August 2015 14:02
  • Vielen Dank für die Antworten und die hilfreichen Links.

    Ja ich habe mir bereits Bücher bestellt, damit ich mich damit ordentlich beschäftigen kann.

    Ich werde es mit der Liste und mit dem 2D Array ausprobieren, so lerne ich gleich noch ein wenig mehr.


    Die Spaltenanzahl ist absolut, aber die Zeilenanzahl variiert.

    Ich habe das jetzt so gelöst:

    Private Sub btnLoad_Click(sender As Object, e As EventArgs) Handles btnLoad.Click Using rdr As New StreamReader(file, FileMode.Open) Dim lines() As String = System.IO.File.ReadAllLines(file) Dim i As Integer = (UBound(lines) - 1) / 5 dgv.Rows.Add(i) For zeile = 1 To Me.dgv.RowCount For spalte = 1 To Me.dgv.ColumnCount Me.dgv.Item(spalte - 1, zeile - 1).Value = rdr.ReadLine Next Next End Using End Sub

    Könnten dabei eventuell Probleme auftreten?

    Mit freundlichen Grüßen

    Steven - M

    Mittwoch, 19. August 2015 10:23