ListView Inhalt - Speichern bzw. Laden

    • VB.NET

    Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von DLL32.

      ListView Inhalt - Speichern bzw. Laden

      Ich habe im Internet kein Snippet zum Speichern und Laden des Inhaltes eines ListView-Controls gefunden, also habe ich mir kurzerhand selbst die Funktion geproggt. Der Code ist nur das "Grundgerüst", Fehlerbehandlung u.Ä. müsst ihr selber machen.

      Kommentare spare ich mir; den Code sollte jeder verstehen.


      Hinweis: Der Code zum Speichern stammt von mir, der zum Laden zum Teil von Dieter Otter(Quelle: HIER).

      Speichern:

      VB.NET-Quellcode

      1. Public Function ListViewSave(ByRef LstVw As ListView, ByVal Path As String)
      2. Dim ListViewContent As String = ""
      3. For I As Integer = 0 To LstVw.Items.Count - 1
      4. ListViewContent += LstVw.Items.Item(I).Text & "##"
      5. For Int As Integer = 0 To LstVw.Items.Item(I).SubItems().Count - 1
      6. ListViewContent += LstVw.Items.Item(I).SubItems(Int).Text & "##"
      7. Next
      8. ListViewContent += vbNewLine
      9. Next
      10. If System.IO.File.Exists(Path) Then
      11. System.IO.File.Delete(Path)
      12. End If
      13. System.IO.File.AppendAllText(Path, ListViewContent)
      14. End Function



      Laden:

      VB.NET-Quellcode

      1. Public Function ListViewLoad(ByRef LstVw As ListView, ByVal Path As String)
      2. Dim sLine As String
      3. Dim sItem() As String
      4. Dim ItemX As ListViewItem
      5. Dim IntCols As Integer
      6. IntCols = LstVw.Columns.Count
      7. FileOpen(1, Path, OpenMode.Input)
      8. With LstVw.Items
      9. While Not EOF(1)
      10. sLine = LineInput(1)
      11. sItem = Split(sLine, "##")
      12. ItemX = .Add(sItem(0), sItem(1))
      13. For I = 2 To intCols
      14. ItemX.SubItems.Add(sItem(I))
      15. Next I
      16. End While
      17. End With
      18. FileClose(1)
      19. End Function
      ListViewSave mit SaveFileDialog und SaveButton
      ListViewLoad mit OpenFileDialog und LoadButton
      Alles nicht das Gelbe vom Ei. Hier eignet sich am besten die Serialisierung.

      VB.NET-Quellcode

      1. Private Sub Serialize(ByVal path As String, ByVal 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. Private Sub Deserialize(ByVal path As String, ByVal 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. End Sub
      für ein paar User die das nicht verstehen:

      (die zip-Version ist 101 kb groß :thumbdown: )
      Dateien
      Oder Text mit vbnewline oder text mit spit oder my settings mit split oder my settings mit vbnewline
      okay es langt xD wir wissen es wir können es auch mit jpg machen halt text reinschreiben , wir können auch mit drawstring Draufschreiben also es ist ziehmlich egal womit man es macht es ist einfach.^^
      also es ist ziehmlich egal womit man es macht

      Eben nicht.
      Leute, immer wenn jemand eine vernünftige Lösung (in diesem Falle sogar mit Beispielcode) nennt, warum wird der dann immer ignoriert? Was ist daran so schwer zu verstehen? Serialisierung ist einfach perfekt für sowas geeignet - und speichert zudem nicht nur die Werte der Items, sondern die Items inklusive aller Eigenschaften usw...

      LG

      Sub stat Function

      für alle die dass nachmachen, da gehären sub Proceduren und keine Functionen rein da nichsmit return ausgegeben wird
      8-) so spartman sich die Warnung und kan gechild bleiben, ohne lufzeit fehler!! 8-)
      für .Net niemals niemals FilePut usw. verwenden, das ist VB6 und veraltet...
      kevin89 hat recht, Serialisierung ist hier eigt. perfekt, wenn man weniger Speicherverbrauch haben möchte, dann muss man sich halt ein eigenes Format machen, am besten nat. mit dem BinaryWriter/Reader...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Habe eine Listview und 2 Texboxen sowie 3 Button`s "Übernehmen"Speichern"und "Öffnen"



      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadWith ÖffnenA
      2. .Filter = "Namen|*.*"
      3. .Multiselect = False
      4. End WithSpeichernD.Filter = "Namen|*.*"

      VB.NET-Quellcode

      1. 'Ladet
      2. Me.lsvView.Items.Clear()Me.lsvView.Columns.Clear()
      3. Me.lsvView.Columns.Add("SPNamen", "Namen:").Width = 47Me.
      4. lsvView.Columns.Add(" SpVornamen", "Vornamen:").Width = 99

      VB.NET-Quellcode

      1. 'Hier übernehmt er es in die Listview
      2. Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click
      3. Dim item As New ListViewItem
      4. item.Text = TextBox1.Text
      5. item.SubItems.Add(TextBox2.Text)
      6. TextBox1.Text = ""
      7. TextBox2.Text = ""
      8. Me.lsvView.Items.Add(item)

      VB.NET-Quellcode

      1. Public Function ListViewLoad(ByRef LstVw As ListView, ByVal Path As String)
      2. ' Dim data() As Byte = System.Text.Encoding.UTF7.GetBytes(ListViewContent)
      3. Dim sLine As String
      4. Dim sItem() As String
      5. Dim ItemX As ListViewItem
      6. Dim IntCols As Integer
      7. IntCols = LstVw.Columns.CountFileOpen(1, Path, OpenMode.Input)
      8. With LstVw.ItemsWhile Not EOF(1)
      9. sLine = LineInput(1)sItem = Split(sLine, "##")
      10. ItemX = .Add(sItem(0), sItem(1))For I = 2 To IntCols
      11. ItemX.SubItems.Add(sItem(I))Next I
      12. End While
      13. End With
      14. FileClose(1)
      15. End Function
      16. Dim ListViewContent As String = ""
      17. Public Function ListViewSave(ByRef LstVw As ListView, ByVal Path As String)
      18. For I As Integer = 0 To LstVw.Items.Count - 1
      19. ListViewContent += LstVw.Items.Item(I).Text & "##"For Int As Integer = 0 To LstVw.Items.Item(I).SubItems().Count - 1
      20. ListViewContent += LstVw.Items.Item(I).SubItems(Int).Text & "##"
      21. Next
      22. ListViewContent += vbNewLine
      23. Next
      24. If System.IO.File.Exists(Path) ThenSystem.IO.File.Delete(Path)
      25. End If
      26. System.IO.File.AppendAllText(Path, ListViewContent)
      27. End
      28. End Function

      VB.NET-Quellcode

      1. Private Sub SaveButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveButton.ClickIf SpeichernD.ShowDialog = Windows.Forms.DialogResult.OK Then ListViewSave(lsvView, SpeichernD.FileName)
      2. End Sub
      3. Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
      4. If ÖffnenA.ShowDialog = Windows.Forms.DialogResult.OK Then ListViewLoad(lsvView, ÖffnenA.FileName)



      Da so der Code:)Sollte das ein wenig unübersichtlich sein.Ich kommentiere den noch rasch:)

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „DLL32“ ()

      Okay,Danke!

      das mit der Serialisieren werd ich auch mal anschauen.

      Wollte es eigentlich ganz einfach haben.An XML speichern werd ich auch nicht drum rum kommen. :D

      Soweit bin ich schon.habe mal das obere beispiel genommen.

      VB.NET-Quellcode

      1. Public Class Form1
      2. Private Sub Serialize(ByVal path As String, ByVal lv As ListView)
      3. Dim f As New IO.FileStream(path, IO.FileMode.Create)
      4. Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
      5. Dim l(lv.Items.Count - 1) As ListViewItem
      6. lv.Items.CopyTo(l, 0)
      7. bf.Serialize(f, l)
      8. f.Close()
      9. End SubPrivate Sub Deserialize(ByVal path As String, ByVal 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. End SubPrivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      16. End SubPrivate Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
      17. Dim item As New ListViewItem
      18. item.Text = TextBox1.Text
      19. item.SubItems.Add(TextBox2.Text)
      20. TextBox1.Text = ""
      21. TextBox2.Text = ""Me.ListView1.Items.Add(item)
      22. End SubEnd Class

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

      dann musste wohl nichts mehr machen, jedoch hat das nichts mit XML zu tun, da es ein BinaryFormatter ist und das ganze Binär speichert(ist platzsparender und evtl. sogar performanter...)...
      aber warum postest du den Code? Funktioniert er denn nicht? Wo funktioniert es denn nicht?
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---