[VB.NET] Inhalt aus mehreren ListViews in XML Datei

Thau

Mitglied
Hallo, ich habe 6 Listviews und 2 Label und von denen möchte ich gerne den Inhalt in eine XML Datei schreiben. Die ListViews haben alle eine unterschiedliche Anzahl von Columns(weiß nicht wie das auf deutsch heißt)
Listview 1: 3
2: 7
3: 6
4: 14
5: 8
6: 15
Zum Test heißen die erstmal a,b,c..etc., also a,b,c bei der ersten und d,... usw bei den anderen. Die Anzahl der Einträge ist auch immer verschieden viel, aber bei jedem Listview gleich viel. Die Buchstaben werden dann später noch durch Begriffe ersetzt.

Die XML Datei soll so ca. aussehen:
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Inhalte>
	<Global>
		<Name>Name</Name>
		<Datum>01.01.2008 00:00:00</Datum>
	</Global>

	<Information Nr="1">
			<a>test</a>
			<b>19</b>
			<c>5</c>
	</Information>


	<Test Nr="1">
			<d>text</d>
			<e>859</e>
			<f>807</f>
			<g>10</g>
			<h>0</h>
			<i>41</i>
			<j>test</j>
	</Test>

....

Da soll der Code aufgerufen werden
Code:
        SaveFileDialogSave.InitialDirectory = Application.StartupPath & "\saves"
        If SaveFileDialogSave.ShowDialog() = DialogResult.OK Then
            Dim dataPath As String = SaveFileDialogSave.FileName

        End If

Ich hoffe jemand versteht was ich meine und kann mir helfen.

Danke

~Thau
 
Zuletzt bearbeitet von einem Moderator:

engelmarkus

Erfahrenes Mitglied
Hast du dich schon mal mit WPF beschäftigt? Das wäre nämlich für so ein Problem ideal. Du könntest ein schönes Databinding machen und hättest keine Probleme mehr.
Code:
...
    <Window.Resources>
        <XmlDataProvider Source="Daten.xml" x:Key="Daten" XPath="/Daten"/>
    </Window.Resources>
    
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/> 
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        
        <ListView Grid.Row="0" Margin="10" ItemsSource="{Binding Source={StaticResource Daten}, XPath=ListView1//Eintrag}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="a" DisplayMemberBinding="{Binding XPath=@a}"/>
                    <GridViewColumn Header="b" DisplayMemberBinding="{Binding XPath=@b}"/>
                    <GridViewColumn Header="c" DisplayMemberBinding="{Binding XPath=@c}"/>                    
                </GridView>
            </ListView.View>
        </ListView>
        
        <ListView Grid.Row="1" Margin="10" ItemsSource="{Binding Source={StaticResource Daten}, XPath=ListView2//Eintrag}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="d" DisplayMemberBinding="{Binding XPath=@d}"/>
                    <GridViewColumn Header="e" DisplayMemberBinding="{Binding XPath=@e}"/>
                    <GridViewColumn Header="f" DisplayMemberBinding="{Binding XPath=@f}"/>
                    <GridViewColumn Header="g" DisplayMemberBinding="{Binding XPath=@g}"/>
                </GridView>
            </ListView.View>
        </ListView> 
    </Grid>
...

Dazu die passende XML-Datei:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<Daten>
  <ListView1>
    <Eintrag a="..." b="..." c="..."/>
    <Eintrag a="..." b="..." c="..."/>    
  </ListView1>

  <ListView2>
    <Eintrag d="..." e="..." f="..." g="..."/>
    <Eintrag d="..." e="..." f="..." g="..."/>
  </ListView2>
</Daten>

Anders wird das doch arg mühselig. Du müsstest jede Zeile aus der ListView auslesen, durch die einzelnen SubItems gehen und diese dann einzeln in die XML-Datei schreiben.
Überhaupt finde ich, dass deine XML-Datei für sowas nicht geeignet ist. Du solltest besser versuchen, so wie oben Attribute zu verwenden und nicht für jede Spalte einen eigenen Knoten :) .
 

Thau

Mitglied
Hi,
damit habe ich mich noch nicht beschäftigt.
Meine XML Dtaie war so aufgebaut,weil ich bishe rnur ein Script zum einlesen gefunden hatte und mir zum Testen die XML erstmal selber gebaut habe. Könntest du mir ein Beispiel geben,wie es mit dme umständlichen Weg wäre? Der Datename variiert eh immer bei der Datei, da es über den FileSaveDialog gemacht wird. Bei dme Beispiel bräuche ich nur eins, wo das ListView angesprochen wird, ich die Anzahl der Spalten angebe und die Items+Subitems auslese. Das müsste ich dann halt für jedes ListView machen. Aber schonmal danke für deine Mühe.


~Thau
 

engelmarkus

Erfahrenes Mitglied
Nachdem du ja die Anzahl der Spalten vorher nicht weißt, würde ich das so machen. Ich verwende die gleiche XML-Datei wie vorher:

Code:
        Dim Daten = XElement.Load("Daten.xml")

        For Each spalte In Daten.<ListView2>.<Eintrag>.First.Attributes
            ListView1.Columns.Add(spalte.Name.LocalName)
        Next

        For Each eintrag In Daten.<ListView2>.<Eintrag>
            Dim spalten As New List(Of String)

            For Each spalte In eintrag.Attributes
                spalten.Add(spalte.Value)
            Next

            ListView1.Items.Add(New ListViewItem(spalten.ToArray()))
        Next
 

Thau

Mitglied
Ich stell mich glaub grad ein bisschen blöd an, aber kannst du mir vielleicht ein Beispiel Projekt machen. Reichen würde mir: Die Inhalte des ListViews in eine XML Laden und dann die xml Datei öffnen und den Inhalt wieder in das ListView laden. Dann weiß ich genau was ich ersetzen muss etc..
Danke

~Thau
 

engelmarkus

Erfahrenes Mitglied
Bittesehr, ich hoffe, das funktioniert einigermaßen, ich habs nicht großartig getestet. :)
 

Anhänge

  • XMLListViewBeispiel.zip
    16,3 KB · Aufrufe: 127

Thau

Mitglied
Vielen dank. Aber ich hab grad gesehen, das das nur im Framework 3.5 läuft. Gibt es da auch eine Möglichkeit das unter 2.0 laufen zu lassen?
 

Thau

Mitglied
Ich hab jetzt den Code zum Speichern mehrere Male hintereinander gemacht für die verschiedenen ListViews, nur sgat er mir immer etwas von:
NullReferenceException was unhandled
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Was heißt das? oder gibt es eine bessere Methode um alle 6 ListViews zu speichern?

EDIT: So jetzt kommen keine Fehler mehr, nur wie machen ich das, das der nicht immer die vorigen Einträge ersetzt, weil ich nach jedem auslesen sage, er soll speichern, also mit:
Daten.Save("Daten.xml"). Das Teil hab ich für jede Abfrage einfach immer ergänzt, also Daten1.Save("Daten.xml"), damit er nicht immer den Inahtl von Daten überschreibt und wegen die Inhalte von dem von Data XElement.
 
Zuletzt bearbeitet:

Thau

Mitglied
Also ich hab jetzt nochmal rumprobiert, bekomme es abe rnicht hin, das ich mehere Einträge in die XML schreiben kann. Es werden immer die alten Einträge überschrieben. ICh habe das so gemacht:

Code:
        Dim Daten As New XElement("Daten", <Information></Information>)

        For Each zeile As ListViewItem In ListView1.Items
            Dim eintrag = <Eintrag/>

            For Each spalte As ColumnHeader In ListView1.Columns
                eintrag.Add(New XAttribute(spalte.Text, zeile.SubItems(spalte.Index).Text))
            Next

            Daten.Element("Information").Add(eintrag)
        Next

       Daten = New XElement("Daten", <Test></Test>)

        For Each zeile As ListViewItem In ListView2.Items
            Dim eintrag = <Eintrag/>

            For Each spalte As ColumnHeader In ListView2.Columns
                eintrag.Add(New XAttribute(spalte.Text, zeile.SubItems(spalte.Index).Text))
            Next

            Daten.Element("Test").Add(eintrag)
        Next

        ' Daten.Save("Daten.xml")

Aber das geht ja irgendwie nicht richtig. Kann mir das jemand korrigieren damit es geht? danke

~Thau