ListView LINQ to XML Class

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    ListView LINQ to XML Class

    Hallo

    Hier habe ich einen code gefunden: vbarchiv.net/tipps/tipp_2081-linq-to-listview.html#;
    die den Inhalt des ListViews und zusätzlich die ColumnHeader Informationen in eine XML Datei speichert und auch wieder auslesen kann.

    Die nachfolgende Klasse erbt von ListView und wird dabei um die Load und Save Methode erweitert. Die neuen Methoden nutzen dabei die LINQ to XML Technik. Doch nicht nur die Daten werden als XML gespeichert, sondern zusätzlich noch die ColumnHeader Informationen, so dass ein ListView komplett wiederhergestellt werden kann.


    Nachfolgend die Klasse ListViewEx:
    Fügen Sie Ihrem Projekt eine neue Klasse hinzu, und kopieren den Code in das Klassenmodul. Erstellen Sie einmal das Projekt, um so die Komponente zu erzeugen. VB.Net stellt die neue Komponente automatisch in die ToolBox oben ein. Sie können jetzt die so neu erzeugte Komponente auf Ihre Form ziehen und damit wie gewohnt arbeiten.


    VB.NET-Quellcode

    1. Imports System.Windows.Forms.ListViewItem
    2. Public Class ListViewEx
    3. Inherits Windows.Forms.ListView Public Sub Save(ByVal FileName As String)
    4. Try
    5. Dim xDoc As New XDocument()
    6. With xDoc
    7. .Declaration = New XDeclaration("1.0", "", "")
    8. .Add(New XElement("ListView"))
    9. ' ColumnHeader in das XML-Dokument einfügen
    10. .Root.Add(From col As ColumnHeader In Me.Columns _
    11. Select <ColumnHeader>
    12. <Text><%= col.Text %></Text>
    13. <Name><%= col.Name %></Name>
    14. <DisplayIndex><%= col.DisplayIndex %></DisplayIndex>
    15. <Width><%= col.Width %></Width>
    16. </ColumnHeader>)
    17. ' Items in das XML-Dokument einfügen
    18. .Root.Add(From Item As ListViewItem In Me.Items _
    19. Select <Item>
    20. <%= From SubItem As ListViewSubItem In Item.SubItems _
    21. Select <Text><%= SubItem.Text %></Text> %>
    22. </Item>)
    23. ' XML-Datei speichern
    24. .Save(FileName)
    25. End With
    26. Catch ex As Exception
    27. Throw ex
    28. End Try
    29. End Sub Public Sub Load(ByVal FileName As String)
    30. Try
    31. Me.Items.Clear()
    32. Me.Columns.Clear()
    33. Me.BeginUpdate()
    34. ' XML-Datei einlesen
    35. Dim xListView = XElement.Load(FileName)
    36. ' ColumnHeader aus XML erstellen
    37. Me.Columns.AddRange((From col In xListView.Descendants("ColumnHeader") _
    38. Select New ColumnHeader With { _
    39. .Text = col.Element("Text"), _
    40. .Name = col.Element("Name"), _
    41. .DisplayIndex = CInt(col.Element("DisplayIndex")), _
    42. .Width = CInt(col.Element("Width"))}).ToArray)
    43. ' Items aus XML einlesen und dem ListView hinzufügen
    44. For Each Item In xListView.Descendants("Item")
    45. Me.Items.Add(New ListViewItem(( _
    46. From SubItem In Item.Descendants("Text") _
    47. Select SubItem.Value).ToArray))
    48. Next
    49. Catch ex As Exception
    50. Throw ex
    51. Finally
    52. Me.EndUpdate()
    53. End Try
    54. End SubEnd Class




    VB.NET-Quellcode

    1. Aufrufbeispiel zum Speichern des ListViewsMe.ListViewEx1.Save("D:\ListView.xml")Aufrufbeispiel zum Laden des ListViewsMe.ListViewEx1.Load("D:\ListView.xml")






    Es funktioniert bei mir nicht, was mach ich falsch ???
    Hallo,

    du schreibst wild mit XML-LINQ in einer XML-Datei herum - das ist fehleranfällig. Lass das lieber den Serialisierer erledigen, denn genau dafür ist er gedacht:

    VB.NET-Quellcode

    1. Imports System.Xml.Serialization
    2. Imports System.Windows.Forms.ListViewItem
    3. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    4. Dim xs As New XmlSerializer(GetType(ListViewStore))
    5. Dim s As New ListViewStore
    6. s.Columns = ListView1.Columns.Cast(Of ColumnHeader).Select(Function(ch) ch.Text).ToList()
    7. s.Items = (From i In ListView1.Items.Cast(Of ListViewItem)() Select (
    8. From si In i.SubItems.Cast(Of ListViewSubItem)()
    9. Select si.Text).ToArray()).ToList()
    10. Using fs As New IO.FileStream("items.xml", IO.FileMode.Create)
    11. xs.Serialize(fs, s)
    12. End Using
    13. End Sub
    14. Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
    15. ListView1.Items.Clear()
    16. ListView1.Columns.Clear()
    17. Dim xs As New XmlSerializer(GetType(ListViewStore))
    18. Dim s As ListViewStore
    19. Using fs As New IO.FileStream("items.xml", IO.FileMode.Open)
    20. s = DirectCast(xs.Deserialize(fs), ListViewStore)
    21. End Using
    22. ListView1.Columns.AddRange(s.Columns.Select(Function(x) New ColumnHeader With {.Text = x}).ToArray())
    23. ListView1.Items.AddRange(s.Items.Select(Function(arr) New ListViewItem(arr)).ToArray())
    24. End Sub
    25. <Serializable()> _
    26. Public Class ListViewStore
    27. Public Property Items As List(Of String())
    28. Public Property Columns As List(Of String)
    29. End Class
    Leider kann man die Objekte (ListViewItem & Co) nicht direkt serialisieren - das würde den Code noch weiter vereinfachen. Falls du weitere Eigenschaften sichern willst (Spaltenbreite z. B.), musst du entsprechend den String in der Columns-Eigenschaft durch eine kleine selbstgeschriebene Klasse ersetzen.

    Falls das Ergebnis nicht unbedingt lesbar sein muss (also keine XML-Datei erforderlich ist), kannst du auch Binärserialisierung verwenden - damit kann man alles serialisieren (z. B. direkt die ListViewItemCollection).
    Gruß
    hal2000
    Lass das ListView, nimm ein DataGridView mit einer daran gebundenen DataTable, die hat bereits table.SaveXml(PFAD) und table.LoadXml(PFAD).
    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!