Listview laden klappt nicht

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Tomekk.

    Listview laden klappt nicht

    Also ich weiss das es dieses Thema schon sehr oft gab.
    Ich fasse mich kurz.
    Speichern tue ich die Listview mit diesem Code:


    VB.NET-Quellcode

    1. Dim sw As New IO.StreamWriter("debug.txt")
    2. For Each lvi As ListViewItem In ListView1.Items
    3. sw.WriteLine(String.Join("|", New String() {lvi.SubItems(0).Text, lvi.SubItems(1).Text, lvi.SubItems(2).Text, lvi.SubItems(3).Text}))
    4. Next
    5. sw.Dispose()



    das Klappt auch super! Das sieht dann so aus in der txt datei:

    Quellcode

    1. Ausgabe|Tomek|04.11.2012 b|-100,00



    Jedoch klappt das laden leider nicht :(

    VB.NET-Quellcode

    1. Dim l As New List(Of String)
    2. ListView1.Items.Clear()
    3. Dim sr As New IO.StreamReader("debug.txt")
    4. For Each line As String In sr.ReadToEnd().Split(vbCrLf)
    5. For Each li As String In line.Split("|")
    6. l.Add(li)
    7. Next
    8. Next




    Wo ist der Fehler?
    Und bitte keine Beiträge darüber wie ungeeignet listview ist! Ich weiss es selber aber jetzt geht es leider nicht mehr anders.
    Du musst natürlich die Elemente aus deiner List(Of String) noch der Listview hinzufügen:

    VB.NET-Quellcode

    1. Dim l As New List(Of String)
    2. ListView1.Items.Clear()
    3. Dim sr As New IO.StreamReader("debug.txt")
    4. For Each line As String In sr.ReadToEnd().Split(vbCrLf)
    5. For Each li As String In line.Split("|")
    6. l.Add(li)
    7. Next
    8. Next
    9. sr.Close()
    10. sr.Dispose()
    11. For Each Str As String In l
    12. ListView1.Items.Add(Str)
    13. Next

    Weil sonst hast du zwar die Werte alle in deiner List(Of String), aber nicht in der Listview ;)

    ―Kai
    Doofer, doofer Fehler :( War zu schnell!Vielen dank :D
    Das einzige Problem ist, das die Subitems jetzt untereinander eingefügt werden, in die erste Reihe (Habe ja 4 Columns)
    Wie bekomm ich die dazwischen? Item 1 | Item 2 | Item 3 | Item 4

    Meine Bemühungen waren bis jetzt erfolglos :S

    Tomekk schrieb:

    Wie bekomm ich die dazwischen? Item 1 | Item 2 | Item 3 | Item 4

    Das geht, indem du eine verschachtelte Schleife verwendest.
    Um entsprechende Einträge einzufärben, müsstest du eig. nur in der Schleife prüfen, ob der betroffene Begriff vorkommt. Dann kannst du über die 'ForeColor'-Eigenschaft die Textfarbe setzen (Hintergrundfarbe geht genauso, nur eben über lv.BackColor):

    VB.NET-Quellcode

    1. Dim l As New List(Of String)
    2. ListView1.Items.Clear()
    3. Dim sr As New IO.StreamReader("debug.txt")
    4. For Each line As String In sr.ReadToEnd().Split(vbCrLf)
    5. For Each li As String In line.Split("|")
    6. l.Add(li)
    7. Next
    8. Next
    9. sr.Close()
    10. sr.Dispose()
    11. Dim lv As ListViewItem
    12. For i As Integer = 0 To l.Count - 1
    13. lv = New ListViewItem(l(i))
    14. If l(i).ToLower.StartsWith("einnahme") Then
    15. lv.ForeColor = Color.Green
    16. ElseIf l(i).ToLower.StartsWith("ausgabe") Then
    17. lv.ForeColor = Color.Red
    18. End If
    19. For si As Integer = 1 To 3
    20. lv.SubItems.Add(l(i + si))
    21. Next
    22. i += 3
    23. ListView1.Items.Add(lv)
    24. Next

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

    Vielen dank!!!


    Quellcode

    1. Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.Parametername: index



    Dieser Fehler kommt bei der Zeile

    VB.NET-Quellcode

    1. lv.SubItems.Add(l(i + si))




    Welchen Grund könnte das haben?? Ich probiere gerade etwas hin und her aber bin noch nicht auf die Lösung gekommen
    Hmm...
    Ich hab das ganze mit folgendem Code getestet:

    VB.NET-Quellcode

    1. l.AddRange({"einnahme", "AA", "AB", "AC", "ausgabe", "BA", "BB", "BC", "ausgabe", "CA", "CB", "CC"})
    2. Dim lv As ListViewItem
    3. For i As Integer = 0 To l.Count - 1
    4. lv = New ListViewItem(l(i))
    5. If l(i).ToLower.StartsWith("einnahme") Then
    6. lv.ForeColor = Color.Green
    7. ElseIf l(i).ToLower.StartsWith("ausgabe") Then
    8. lv.ForeColor = Color.Red
    9. End If
    10. For si As Integer = 1 To 3
    11. lv.SubItems.Add(l(i + si))
    12. Next
    13. i += 3
    14. ListView1.Items.Add(lv)
    15. Next

    Da hat alles geklappt.

    Kannst du mal deine debug.txt posten?
    Vielleicht sind die Einträge dort doch anders angeordnet, als ich angenommen hab ...
    Also... bei mit klappt alles problemlos, wenn ich in meine Debug.txt genau diese eine Zeile schreibe...

    ...wenn ich allerdings noch eine Leerzeile anfüge (also einfach am Ende der Zeile Enter drücke) dann kommt bei mit der Fehler auch.

    Ändere mal den Code so ab:

    VB.NET-Quellcode

    1. Dim l As New List(Of String)
    2. ListView1.Items.Clear()
    3. Dim sr As New IO.StreamReader("debug.txt")
    4. For Each line As String In sr.ReadToEnd().Trim.Split(vbCrLf)
    5. For Each li As String In line.Split("|")
    6. l.Add(li)
    7. Next
    8. Next
    9. sr.Close()
    10. sr.Dispose()
    11. Dim lv As ListViewItem
    12. For i As Integer = 0 To l.Count - 1
    13. lv = New ListViewItem(l(i))
    14. If l(i).ToLower.StartsWith("einnahme") Then
    15. lv.ForeColor = Color.Green
    16. ElseIf l(i).ToLower.StartsWith("ausgabe") Then
    17. lv.ForeColor = Color.Red
    18. End If
    19. For si As Integer = 1 To 3
    20. lv.SubItems.Add(l(i + si))
    21. Next
    22. i += 3
    23. ListView1.Items.Add(lv)
    24. Next

    Das trim in der vierten Zeile verhindert, dass leere Zeilen ebenfalls miteinbezoge werden; so klappts mit beliebig vielen Leerzeilen vor und nach den eigentlichen Daten :)
    Jaaa super :D Lag ja echt an der Leerzeile! Manchmal bringt so etwas einen echt zum verzweifeln :D
    Tausend dank nochmal!

    Ich will ja nicht unhöflich wirken ;), jedoch wird beim laden nur die erste Zeile Rot bzw. Grün markiert oO
    Ich habe versucht die Abfrage etwas später durchzuführen, jedoch ohne Erfolg... Kann sein das ich mir da etwas viel vorgenommen habe für den Anfang,
    bin jedoch jetzt fast fertig und daran soll es nicht scheitern ^^

    Thomas

    Tomekk schrieb:

    Ich will ja nicht unhöflich wirken ;), jedoch wird beim laden nur die erste Zeile Rot bzw. Grün markiert oO


    Interessant...
    Bei mit passiert das nicht...
    Ich habe diesen Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    3. Dim l As New List(Of String)
    4. ListView1.Items.Clear()
    5. Dim sr As New IO.StreamReader("debug.txt")
    6. For Each line As String In sr.ReadToEnd().Trim.Split(vbCrLf)
    7. For Each li As String In line.Split("|")
    8. l.Add(li)
    9. Next
    10. Next
    11. sr.Close()
    12. sr.Dispose()
    13. Dim lv As ListViewItem
    14. For i As Integer = 0 To l.Count - 1
    15. lv = New ListViewItem(l(i).Trim)
    16. If l(i).Trim.ToLower.StartsWith("einnahme") Then
    17. lv.ForeColor = Color.Green
    18. ElseIf l(i).Trim.ToLower.StartsWith("ausgabe") Then
    19. lv.ForeColor = Color.Red
    20. End If
    21. For si As Integer = 1 To 3
    22. lv.SubItems.Add(l(i + si).Trim)
    23. Next
    24. i += 3
    25. ListView1.Items.Add(lv)
    26. Next
    27. End Sub
    28. End Class


    Und das in der Debug.txt stehen:

    Quellcode

    1. Ausgabe|Tomek|04.11.2012 b|-100,00
    2. Ausgabe|Tomek|04.11.2012 b|-100,00
    3. Einnahme|Tomek|04.11.2012 b|-100,00
    4. Ausgabe|Tomek|04.11.2012 b|-100,00
    5. Ausgabe|Tomek|04.11.2012 b|-100,00
    6. Einnahme|Tomek|04.11.2012 b|-100,00
    7. Einnahme|Tomek|04.11.2012 b|-100,00
    8. Ausgabe|Tomek|04.11.2012 b|-100,00


    Und bekomme als Ergebnis:


    Ist doch so, wie es sein sollte, oder? 8|
    Hmm mit dem Code geht es nun auch!! Keine Ahnung was es für einen Grund hatte.
    Es ist genau so wie es sein sollte! :D Das nächste mal mache ich etwas, das nicht so schwer ist (für den Anfang)!
    Wollte nur was kleines haben um meine Ausgaben und Einnahmen zu sehen, was dann doch etwas komplexer wurde.

    Vielen, vielen dank!
    Der klassische ListView-Holzweg: Man murkst und murkst, und löst ein Problem nach dem andern, welches sich aus dem falschen Ansatz ergibt.

    Schwierig nun die Frage: Hat es dir genützt, letztendlich dochnoch eine ListView-Lösung zu finden, oder geschadet?
    Weil die nächste Datenverarbeitung wirst du nun wieder mit dem falschen Ansatz angehen.

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