Problem beim schreiben von einer Listbox in TXT Datei

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von TVX.

    Problem beim schreiben von einer Listbox in TXT Datei

    Ich habe mir in einem Programm eine ganz einfache Varriante gefertigt mit deren Hilfe ich den Text einer Listbox zeilenweise in eine TXT Datei einlesen kann.

    Die Umsetzung ist simpel:

    Quellcode

    1. Dim text As String = ""
    2. For Each item As String In progbox.Items
    3. text &= item & vbcrlf
    4. Next
    5. IO.File.WriteAllText("C:\temp\mbtxt.txt", text)



    Das Problem an der Geschichte:
    Dadurch das die neue Zeile in der Textdatei durch "vbcrlf" ausgelöst wird, habe ich nach jedem speichern der Listbox/laden der txt datei ein leeres Item am Ende der Listbox.


    Ich habe auch schon etliche andere Codes aus Google getestet.
    Überall dasselbe.
    Leider kann ich es nicht dabei belassen, da dieses Problem einen Fehler im Rest des Codes auslöst und wenn ich mit Try den Fehler umgehen würde, siehts in der Darstellung einfach kacke aus wenn ich neue Items hinzufüge.


    Wer kann mir einen besseren Code empfehlen?

    VB.NET-Quellcode

    1. Dim text As String = ""
    2. For Each item As String In progbox.Items
    3. If not item.index = progbox.items.count - 1 then
    4. text &= item & vbcrlf
    5. Else
    6. text &= item
    7. End if
    8. Next
    9. IO.File.WriteAllText("C:\temp\mbtxt.txt", text)


    Somit wird keine neue Zeile hinzugefügt, wenn das letzte Item in der Listbox erreicht ist.

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

    Bazz_MuTTanTT schrieb:

    Und count soll angeblich kein Member von Listbox sein

    Ist's auch nicht. :P Eine ListBox hat eine ​Items-Property, welche eine Auflistung ist und daher stellt diese dann eine ​Count-Eigenschaft bereit, nicht die ListBox, denn die ist ein Control. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Warum machst Du es auch so kompliziert mit Konstanten etc.? Das Framework stellt da jede Menge bereit. Da ist das das Entfernen auch unnötig.
    Mach es so:

    Imports-Anweisung setzen: Imports System.IO

    und dann:

    VB.NET-Quellcode

    1. Dim writer As New StreamWriter("Pfad")
    2. For Each item In ListBox1.Items
    3. writer.WriteLine(item.ToString())
    4. Next


    4 Zeilen, funktioniert gut und Du sparst Dir all das Ganze unnötige Zeugs.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Dann zeige mal Deinen Code her und setze ggf. mal Haltepunkte und gehe im Einzelschritt durch, um zu sehen, was passiert.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Quellcode

    1. Try
    2. Dim writer As New StreamWriter("C:\temp\mbtxt.txt")
    3. For Each item In progbox.Items
    4. writer.WriteLine(item.ToString())
    5. Next
    6. MsgBox("Liste gespeichert", MsgBoxStyle.Information, "Erfolg")
    7. Catch
    8. MsgBox("Liste kann nicht gespeichert werden." & vbNewLine & "Eventuell ist ein Fehler beim erstellen des savefiles aufgetreten.", MsgBoxStyle.Exclamation, "")
    9. End Try



    Ein Fehler tritt ja nicht auf, aber die Box und das TXT File ist halt leer
    Ähm, hast Du die Box vorher überhaupt mit irgendwas gefüllt?
    Zudem: Visual Studio - Empfohlene Einstellungen
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Bazz_MuTTanTT schrieb:

    ist halt leer
    Du musst den writer ordentlich beenden.

    VB.NET-Quellcode

    1. Using writer As New IO.StreamWriter("C:\temp\mbtxt.txt")
    2. For Each item In progbox.Items
    3. writer.WriteLine(item.ToString())
    4. Next
    5. End Using
    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!
    Ich würde die Sache so einfach wie möglich halten:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _path As String = "data.txt"
    3. Public Sub New()
    4. InitializeComponent()
    5. If File.Exists(_path) Then
    6. ListBox1.Items.AddRange(File.ReadAllLines(_path))
    7. End If
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. File.WriteAllLines(_path, ListBox1.Items.OfType(Of String))
    11. End Sub
    12. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So, nach ewig probieren habe ich eine halbwegs stabil laufende Lösung gefunden.

    Die Listbox speichere ich normal mit dem Code von RodFromGermany.

    Quellcode

    1. Using writer As New IO.StreamWriter("C:\temp\mbtxt.txt")
    2. For Each item In progbox.Items
    3. writer.WriteLine(item.ToString())
    4. Next
    5. End Using



    Da aber jeder der Codes die letzte leere Zeile mit abbildet, und ich einfach zu dusslig bin den Fehler zu finden, habe ich jetzt kurzerhand folgenen Code vor den Code gesetzt, der das ganze aus der Textdatei wieder ausließt:

    Quellcode

    1. For Each item As Object In progbox.Items
    2. If item.ToString = "" Then
    3. progbox.Items.Remove(item)
    4. '#### Leere Zeilen werden gelöscht ########
    5. Else
    6. End If
    7. Next


    Und das ganze in ein "Try" gepackt, da es hin und wieder eine Fehlermeldung ausspuckt:

    Was dann aungefähr so aussieht:

    Quellcode

    1. Try
    2. Dim a As New RichTextBox
    3. a.Text = IO.File.ReadAllText("C:\temp\mbtxt.txt")
    4. For i As Integer = 0 To a.Lines.Count - 1
    5. progbox.Items.Add(a.Lines(i))
    6. Next i
    7. '##### Leere Zeilen löschen #####
    8. For Each item As Object In progbox.Items
    9. If item.ToString = "" Then
    10. progbox.Items.Remove(item)
    11. End If
    12. Next
    13. Catch
    14. End Try



    Ich danke euch allen für eure Hilfe, ich gehe jetzt in den nächsten Buchladen und besorge mir ein Handbuch zu VB.net

    Bazz_MuTTanTT schrieb:

    und ich einfach zu dusslig bin den Fehler zu finden
    Bist Du nicht, das macht WriteLine.Wenn ühaupt eine Zeile vorhanden ist, mach es so:

    VB.NET-Quellcode

    1. Using writer As New IO.StreamWriter("C:\temp\mbtxt.txt")
    2. For i = 0 To progbox.Items.Count - 2
    3. writer.WriteLine(progbox.Items(i).ToString())
    4. Next
    5. writer.Write(progbox.Items(progbox.Items.Count - 1).ToString())
    6. End Using
    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!
    Entferne das / die leeren items am Ende der Listbox direkt nach füllen / aktualisieren der Listbox !
    Setz diesen Code drunter und das ende bleibt immer sauber !

    Quellcode

    1. ​ For i As Integer = ListBox1.Items.Count - 1 To 0 Step -1
    2. If ListBox1.Items.Item(i).ToString = "" Then
    3. ListBox1.Items.RemoveAt(i)
    4. Else
    5. Exit For
    6. End If
    7. Next


    Und dann....

    Quellcode

    1. Dim fs As New IO.FileStream(IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Test.txt"), IO.FileMode.Append)
    2. Using sw As New IO.StreamWriter(fs)
    3. For Each item As String In ListBox1.Items
    4. sw.WriteLine(item)
    5. Next
    6. End Using



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

    TVX schrieb:

    Und dann....
    hängt WriteLine() einen Zeilenumbruch an das Ende jeder geschriebenen Zeile, sogar bei der letzten Zeile.
    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!

    TVX schrieb:

    falsch verstanden ?
    Das sind wohl 2 Probleme, eines ist die Leerzeile in der Datei (kann, muss nicht) das andere ist das leere Item in der Listbox, das soll nicht.
    Unpräzise beschreibung vom TE. :/
    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!

    RodFromGermany schrieb:

    TVX schrieb:

    falsch verstanden ?
    Das sind wohl 2 Probleme, eines ist die Leerzeile in der Datei (kann, muss nicht) das andere ist das leere Item in der Listbox, das soll nicht.
    Unpräzise beschreibung vom TE. :/


    OK dann stopfen wir beide Löscher

    1: Überflüssige Leerzeilen am Ende der Listbox entfernen :

    VB.NET-Quellcode

    1. For i As Integer = ListBox1.Items.Count - 1 To 0 Step -1
    2. If ListBox1.Items.Item(i).ToString = "" Then
    3. ListBox1.Items.RemoveAt(i)
    4. Else
    5. Exit For
    6. End If
    7. Next


    Und dann so !

    VB.NET-Quellcode

    1. Using writer As New IO.StreamWriter(IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.Desktop, "Test.txt"))
    2. Dim items As New System.Text.StringBuilder
    3. For Each Item As String In ListBox1.Items
    4. items.AppendLine(Item)
    5. Next
    6. writer.Write(items.ToString.Trim(vbCrLf.ToCharArray))
    7. End Using

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