Serialize & Deserialize von Listview und Imagelist

  • VB.NET

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

    Serialize & Deserialize von Listview und Imagelist

    Frohe Weihnachten,

    um Zeit zu sparen wollte ich beim Programmstart den letzten Zuatand der Listview und der dazugehörigen Imagelist abspeichern. Klappt auch mit Serilisieren und Deserilisieren ganz gut, nur scheint es ein Problem zu geben, das du ImageKeys verloren gehen.

    ListView:

    VB.NET-Quellcode

    1. Public Sub SerializeListView(ByVal path As String, ByRef lv As ListView)
    2. Dim f As New IO.FileStream(path, IO.FileMode.Create)
    3. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    4. Dim l(lv.Items.Count - 1) As ListViewItem
    5. lv.Items.CopyTo(l, 0)
    6. bf.Serialize(f, l)
    7. f.Close()
    8. End Sub
    9. Public Sub DeserializeListView(ByVal path As String, ByRef lv As ListView)
    10. Dim f As New IO.FileStream(path, IO.FileMode.Open)
    11. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    12. lv.Items.Clear()
    13. lv.Items.AddRange(bf.Deserialize(f))
    14. f.Close()
    15. For Each i As ListViewItem In lv.Items
    16. i.Name = i.ImageKey
    17. 'i.ImageKey = "default"
    18. Next
    19. End Sub



    1. Variante Imagelist

    VB.NET-Quellcode

    1. <Serializable()> Public Class clsBildliste
    2. Public Key As ArrayList
    3. Public Image As ArrayList
    4. End Class
    5. Public Sub SerializeImageList3(ByVal path As String, ByRef il As ImageList)
    6. Dim f As New IO.FileStream(path, IO.FileMode.Create)
    7. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    8. Dim n As Integer
    9. Dim m As Integer
    10. Dim img As New clsBildliste
    11. img.Key = New ArrayList
    12. img.Image = New ArrayList
    13. For n = 0 To il.Images.Count - 1
    14. img.Key.Add(il.Images.Keys(n))
    15. m = il.Images.IndexOfKey(il.Images.Keys(n))
    16. img.Image.Add(il.Images.Item(m))
    17. Next
    18. bf.Serialize(f, img)
    19. f.Close()
    20. End Sub
    21. Public Sub DeserializeImageList3(ByVal path As String, ByRef il As ImageList)
    22. Dim fs As New FileStream(path, FileMode.Open)
    23. Dim bf As New BinaryFormatter()
    24. Dim img As New clsBildliste
    25. img = bf.Deserialize(fs)
    26. Dim n As Integer
    27. For n = 0 To img.Image.Count - 1
    28. il.Images.Add(img.Key(n + 1), img.Image(n))
    29. Next
    30. fs.Close()
    31. End Sub


    2. Variante Imagelist

    VB.NET-Quellcode

    1. Public Sub SerializeImageList(ByVal path As String, ByRef il As ImageList)
    2. Dim f As New IO.FileStream(path, IO.FileMode.Create)
    3. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
    4. bf.Serialize(f, il.ImageStream)
    5. f.Close()
    6. End Sub
    7. Public Sub DeserializeImageList(ByVal path As String, ByRef il As ImageList, ByRef lv As ListView) 'obwohl key's matchen wird nicht zugeordnet..
    8. Dim fs As New FileStream(path, FileMode.Open)
    9. Dim bf As New BinaryFormatter()
    10. il.ImageStream = bf.Deserialize(fs)
    11. Dim n As Integer
    12. For n = 0 To lv.Items.Count - 1
    13. il.Images.SetKeyName(n, lv.Items.Item(n).ImageKey)
    14. Next
    15. fs.Close()
    16. End Sub


    Bei zweiten erscheinen keinen Bilder und bei ersteren "verrutschen" diese immer.

    Hat jeman damit Erfahrungen bzw. sieht den Knackpunkt?
    Vielen Dank für die Hinweise.
    Nach dem Einlesen befürchte ich, dass das DatagridView leider keine "LargeIcon" Ansicht wie das ListView aufweist, welche ich aber benötige.
    Das Dataset sieht aber als Datenspeicher gut aus, das werde ich versuchen mit dem ListView zu verwenden (befüllen und speichern als extra Funktion) - Auch wenn ich befüchte, dass das nicht die Intension der Antwort war. :whistling: