Save xml avec listview1

hacker591 Messages postés 34 Date d'inscription mardi 10 juin 2014 Statut Membre Dernière intervention 26 janvier 2022 - 14 août 2017 à 09:19
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 16 août 2017 à 01:42
Bonjour,
PlayerSave version="4">
  <Tutorial lockedContracts="5" complete="1" playedIntro="City-3" />
  ....etc
  <Intro done="false" scenesPlayed="" npcsMet="" seenConstruction="false" />
  </Storage>
  <Inventory level="1" type="3" capacity="3" />
  <Inventory level="1" type="4" capacity="-1" />
  <Inventory level="1" type="2" capacity="2147000000" />
  <Inventory level="1" type="1" capacity="2147000000" />
  <Inventory level="1" type="0" capacity="-1" />


mon code de lecture :
If File.Exists(parcourir) Then
            document.Load(Me.parcourir)
            For Each Node3 As Xml.XmlElement In document.SelectNodes("/PlayerSave/Inventory")
                Dim item As New ListViewItem(Node3.GetAttribute("level"))
                item.SubItems.Add(Node3.GetAttribute("capacity"))
                ListView1.Items.Add(item)
            Next
        End If


mon code enregistrement 1 :
Private Sub savefilexml(parcourir As String)
        Try
            document.Load(parcourir)
            For Each Node1 As Xml.XmlElement In document.SelectNodes("/PlayerSave/Inventory")
                For Each lvi As ListViewItem In ListView1.Items
                    Node1.Attributes.GetNamedItem("Capacity").Value = ListView1.Items(lvi.Index).SubItems(1).Text
                Next
            Next
            document.Save(Me.parcourir)
            MessageBox.Show("Fichier enregistrer!", "Sauvegarder", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch ex As Exception
            MessageBox.Show("Erreur de enregistrement du fichier", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub


mon code enregistrement 2 :
Private Sub savefilexml(parcourir As String)
        Try
            document.Load(parcourir)
            For Each Node1 As Xml.XmlElement In document.SelectNodes("/PlayerSave/Inventory")
                Dim Nodexml As XmlNodeList = Node1.ChildNodes
                For j = 0 To ListView1.Items.Count - 1
                    For Each lvi As ListViewItem In ListView1.Items
                        Nodexml.ItemOf(j).Attributes.GetNamedItem("Capacity").Value = lvi.SubItems(1).Text
                    Next
                Next
                Next
            document.Save(Me.parcourir)
            MessageBox.Show("Fichier enregistrer!", "Sauvegarder", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Catch ex As Exception
            MessageBox.Show("Erreur de enregistrement du fichier", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub


Mon probléme, j'arrive pas enregistrer avec listview1 du fichier xml.
Pouvez-vous me dire comment faire pour enregistrer avec listview1?

Merci de comprehension,
cordialement,

1 réponse

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
16 août 2017 à 01:39
bonjour

de la façon dont tu t'y prends (analyse rapide, code pas testé)

Voila ce que tu as écrit
Code1
je prends le 1er noeud (peut importe du quel il s'agit), et tour à tour je lui affecte toutes les valeurs de subitem.
Puis je passe au second noeud, et tour à tour je lui affecte toutes les valeurs de subitem.
Et ainsi de suite jusqu'au dernier noeud.

Sans avoir testé ce code, je parie qu'il donne à tous tes noeuds le dernier subitem existant.


Cas 2
Fait à peu près la même chose.

Ce que tu dois faire est de chercher le noeud qui correspond à un item, et quand tu l'as trouvé et seulement quand tu l'as trouvé, tu affectes la valeur de l'attribut.
Cependant, ceci ne prendra pas en compte les ajouts ou suppressions de ligne.
Il faudra donc le gérer en plus, quand on supprime une ligne, il faut supprimer le noeud correspondant, et quand on ajoute une ligne il faut ajouter le noeud correspondant, à noter que tes lignes d'exemples possèdent l'attribut type en plus de level et capacity.


Maintenant, cette façon de faire n'est pas très "vb.net", c'est plus un bricolage à l'ancienne.
Il serait plus dans l'esprit .Net d'écrire une classe correspondant à ce fichier xml, de la desialiser dans une collection (perso j'aime bien Linq To XML, mais il y a d'autres méthodes, XmlSerializer par exemple).
C'est ensuite les instances de cette collection qu'il faudrai afficher.
Ainsi en cas de modification, tu aurais de suite accès à la bonne instance.
Il faudrait tout de même gérer les ajouts et suppression car la ListView ne supporte pas le binding (des solutions alternatives sont proposées ).

Quand tu veux enregistrer, il te suffit de serialiser la collection.

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
16 août 2017 à 01:42
PS
"Fichier enregistré!"
avec un é
"Erreur d'enregistrement du fichier"
avec un d' ou encore mieux
"Erreur lors de l'enregistrement du fichier"


Si c'est un logiciel que tu destines à quelqu'un d'autre, les fautes d'orthographe font mauvais genre, même si tout le reste marche bien.
0
Rejoignez-nous