Save xml avec listview1

Messages postés
31
Date d'inscription
mardi 10 juin 2014
Dernière intervention
14 août 2017
- - Dernière réponse : Whismeril
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
- 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,
Afficher la suite 

Votre réponse

1 réponse

Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
0
Merci
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.

Whismeril
Messages postés
12421
Date d'inscription
mardi 11 mars 2003
Dernière intervention
18 décembre 2018
-
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.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.