Textdatei unterteilt in DGV einfügen

  • VB.NET

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

    Textdatei unterteilt in DGV einfügen

    Hallo Forum,

    Ich habe folgendes Problem:

    Ich möchte eine Zeile aus einer Textdatei in eine DGV laden. Leider bekomme ich immer nur den 1. Eintrag angezeigt.
    Gibt es eine Möglichkeit die Zeilen weiterführend einzufügen?

    Die einzulesende Textdatei

    Zeile 4:
    Mazda 3 G120|Benzin|2000|120|1205|10,04||21290|17032|Ford Focus|Benzin|1500|150|1330|8,87||24050|19240|

    Mein geschriebener Code

    VB.NET-Quellcode

    1. Dim lines() As String = System.IO.File.ReadAllLines(loadFileDialog1.FileName)
    2. SplitLine = Split(lines(3), "|")
    3. Autogarage.DataGridView_Garage.Rows.Add(SplitLine)
    @Auris Am besten ist es, wenn Du Dir ne DataTable baust, die die korrekte Struktur hat.
    Die befüllst Du mit den Daten der CSV und weist sie dem DGV als DataSource zu.
    Feddich.
    Die prinzipielle Funktionsweise gugst Du hier: Differenz in Prozent ausrechnen
    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!
    Mein DGV hat 9 Spalten wovon eine leer ist.
    In der Textdatei sind unter anderem auch Texte von TextBoxen hinterlegt.
    Ich versuche das alles in diese eine Datei zu bekommen.
    Die Zeilen der DGV können allerdings variieren.

    Es funktioniert alles soweit außer das ich nicht die nächste Zeile nach der 1. Zeile angezeigt bekomme
    9 Spalten reichen nicht - die Anzahl an Elementen in deinem Array ist größer als 9.


    In der Textdatei sind unter anderem auch Texte von TextBoxen hinterlegt.

    Was hat das damit zu tun? 8|

    Ich versuche das alles in diese eine Datei zu bekommen.
    Die Zeilen der DGV können allerdings variieren.

    Ich verstehe nicht was du damit sagen willst?

    Es funktioniert alles soweit außer das ich nicht die nächste Zeile nach der 1. Zeile angezeigt bekomme

    Ich dachte dein Problem ist dass du nur den ersten Eintrag aus dem Array bekommst?

    Den Tip von Rod kann ich nur unterstützen.
    Gruß Murdoc
    Meine Daten aus dem Programm werden in der Textdatei gespeichert.

    Textbox1 in Zeile 0
    TextBox2 in Zeile 1
    ...

    In der dritten Zeile werden die Daten der DGV abgelegt.

    Jetzt lade ich die Daten wieder in die DGV.
    Hier liegt mein Problem. Ich bekomme beim Zugriff auf die Daten nur die erste Zeile angezeigt.
    Das Array ist also das Problem.
    Ich weiß nicht, wie ich es unterteilt bekomme für einzelne Zeilen auszulesen.
    Der Inhalt der Datei:

    74660,85
    Fahrzeug: Ford Focus
    19240
    Mazda 3 G120|Benzin|2000|120|1205|10,04||21290|17032|Ford Focus|Benzin|1500|150|1330|8,87||24050|19240|


    Der Code zum Laden:


    VB.NET-Quellcode

    1. Dim loadFileDialog1 As New OpenFileDialog With {
    2. .Filter = "TextDateien|*.txt",
    3. .Title = "TextBox laden"
    4. } 
    5. loadFileDialog1.ShowDialog()
    6. If loadFileDialog1.FileName <> "" Then
    7. Dim lines() As String = System.IO.File.ReadAllLines(loadFileDialog1.FileName)
    8. Dim SplitLine() As String
    9. SplitLine = Split(lines(3), "|")
    10. TextBox_KontostandHF.Text = lines(0)
    11. Autogarage.TextBox_Auto.Text = lines(1)
    12. Autogarage.TextBox_VKP.Text = lines(2)
    13. Autogarage.DataGridView_Garage.Rows.Add(SplitLine)
    14. End IF



    An petaod

    Die Felder der CSV können unterschiedlich lang sein, je nach abgespeichertem Eintrag, bzw. Einträgen. Also bei der Zeile für die DGV n*9
    Es gibt keinen weiteren Delimiter. Daran habe ich schon gedacht, jedoch habe ich keine Ahnung wie das gehen soll. Dann müsste ich jedenfalls auch beim Abspeichern der Datei etwas ändern.

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

    Der Code zum Laden:

    VB.NET-Quellcode

    1. Dim Zelle As Integer = 0
    2. Dim Celle As Integer = 0
    3. Dim cellvalue$
    4. Dim rowLine As String = ""
    5. Dim saveFileDialog1 As New SaveFileDialog With {
    6. .Filter = "TextDateien|*.txt",
    7. .Title = "TextBox speichern"
    8. }
    9. saveFileDialog1.ShowDialog()
    10. If saveFileDialog1.FileName <> "" Then
    11. If IsNothing(Autogarage.DataGridView_Garage.FirstDisplayedCell) Then
    12. MsgBox("Speichern erst nach Kauf" + vbNewLine + "von Fahrzeug möglich")
    13. Else
    14. For Zeile = 0 To Autogarage.DataGridView_Garage.Rows.Count - 1
    15. For Celle = 0 To Autogarage.DataGridView_Garage.Columns.Count - 1
    16. If Not TypeOf Autogarage.DataGridView_Garage.CurrentRow.Cells.Item(Celle).Value Is DBNull Then
    17. cellvalue = Autogarage.DataGridView_Garage.Item(Celle, Zeile).Value
    18. Else
    19. cellvalue = ""
    20. End If
    21. rowLine = rowLine + cellvalue + "|"
    22. Next
    23. My.Computer.FileSystem.WriteAllText(saveFileDialog1.FileName, TextBox_KontostandHF.Text & vbNewLine _
    24. & Autogarage.TextBox_Auto.Text & vbNewLine _
    25. & Autogarage.TextBox_VKP.Text & vbNewLine _
    26. & rowLine, False)
    27. Next
    28. End If
    29. End If



    Nochmal die Textdatei:

    74660,85
    Fahrzeug: Ford Focus
    19240
    Mazda 3 G120|Benzin|2000|120|1205|10,04||21290|17032|Ford Focus|Benzin|1500|150|1330|8,87||24050|19240|
    Passe die Schreibprozedur wie folgt an:

    VB.NET-Quellcode

    1. ​Dim Lines As New List(Of String)
    2. Lines.Add(Autogarage.TextBox_Auto.Text)
    3. Lines.Add(Autogarage.TextBox_VKP.Text)
    4. For Zeile = 0 To Autogarage.DataGridView_Garage.Rows.Count - 1
    5. For Celle = 0 To Autogarage.DataGridView_Garage.Columns.Count - 1
    6. If TypeOf Autogarage.DataGridView_Garage.CurrentRow.Cells.Item(Celle).Value Is DBNull Then
    7. cellvalue = ""
    8. Else
    9. cellvalue = Autogarage.DataGridView_Garage.Item(Celle, Zeile).Value
    10. End If
    11. rowLine = rowLine + cellvalue + "|"
    12. Next
    13. Lines.Add(rowLine.SubString(0, rowLine.Length - 1)
    14. Next
    15. IO.Files.WriteAllLines(saveFileDialog1.FileName, Lines)
    Es gäbe noch einiges zu optimieren, aber ich wollte, dass du deinen Code einigermassen wiedererkennst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    Was ist mit IO.Files im letzten Eintrag gemeint?

    Ich bekomme den Fehler:

    "Files" ist keim Member von "System.IO"

    angezeigt.

    Schon mal Danke für die Mühen

    Ok. habe File für Files eingesetzt. Mal sehen was daraus geworden ist

    Das sieht viel aufgeräumter aus.
    Das Ergebnis sieht jetzt so aus:

    74660,85
    Fahrzeug: Ford Focus
    19240
    Mazda 3 G120|Benzin|2000|120|1205|10,04||21290|17032
    Mazda 3 G120|Benzin|2000|120|1205|10,04||21290|17032 |Ford Focus|Benzin|1500|150|1330|8,87||24050|19240

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

    Du könntest nach Zeile 4 noch ein rowLine = "" einfügen.
    Das hatte ichvergessen.

    Ansonsten habe ich mich mal verkünstelt, die Zellen mit Join zusammenzunageln:

    VB.NET-Quellcode

    1. Dim Lines As New List(Of String)
    2. Lines.Add(Autogarage.TextBox_Auto.Text)
    3. Lines.Add(Autogarage.TextBox_VKP.Text)
    4. For Each Row in Autogarage.DataGridView_Garage.Rows
    5. Lines.Add(String.Join("|", Array.ConvertAll((CType(Row, DataGridViewRow)).Cells.Cast(Of DataGridViewCell).ToArray(), Function(ByVal c As DataGridViewCell) (If((c.Value Is Nothing), "", c.Value.ToString())))))
    6. Next
    7. IO.File.WriteAllLines(saveFileDialog1.FileName, Lines)
    Funktioniert. Aber es wird unverständlich.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Dann mal ganz herzlichen Dank petaod.

    Es ist zwar für mich noch schwer nachzuvollziehen, aber die Lösung für mein Problem. :)

    Jetzt versuche ich mal das Ganze so umzubauen, das es mit dem Laden dann auch entsprechend funktioniert.
    Habe ja jetzt Zeile für Zeile. Das ist TOP.
    Vor allem sehr übersichtlich