Porbléme sur fichier xml en c#

Signaler
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
-
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007
-
Bonjour,

J'arrive a ecire dans mon xml mais je voie pas comment
limiter le nombre d'enregistrement dans le xml sachant que je voudrais
que les scores soit mis a jour si un score plus fort arrive et que si
un nom existe deja que son score soit remplacer si il la amélioré.

Donc si quelqu'un a une idée, une piste ou une aide je lui en serait grandement reconnaissant.


Code pour ecrire dans xml :




DataSet set = new DataSet();
set.ReadXml("score.xml");
DataView custDV new DataView(set.Tables["score"], "nom 'Michou'", null, DataViewRowState.CurrentRows);

DataRowView nouveau = custDV.AddNew();
nouveau.Row["nom"] = "loutre";
nouveau.Row["time"] = 100;
nouveau.EndEdit();

set.WriteXml("score.xml");



Aussi jai ce code pour lire afficher les champ time et nom de mon fichier xml mais je n'arrive pas a les classés du meilleur au moins bon.

DataSet set = new DataSet();
set.ReadXml("score.xml");

this.dataGridView1.DataSource = set;
this.dataGridView1.DataMember = "score";

Aussi mon fichier xml :

<listescores>
<score>
<nom>Bob</nom>
<time>100s</time>
</score>
<score>
<nom>Max</nom>
<time>5s</time>
</score>
<score>
<nom>Louis</nom>
<time>10000s</time>
</score>
<score>
<nom>Elodie</nom>
<time>200s</time>
</score>
<score>
<nom>Maria</nom>
<time>10000s</time>
</score>
<score>
<nom>DjMike</nom>
<time>900s</time>
</score>
</listescores>

Merci a vous de votre aide car la je bloque et j'en puis plus, merci

6 réponses

Messages postés
346
Date d'inscription
lundi 8 septembre 2003
Statut
Membre
Dernière intervention
3 septembre 2007
3
pour écrire je pense que tu peux faire directement :

DataRow nouveau = set.Tables["score"].NewRow();
...

set.Tables["score"].Add (nouveau);

je suis pas sur pour la syntaxe, mais ca doit pas etre loin de ca.

Pour modifier une ligne, et bien tu n'es pas loin . J'imagine que dans ce cas là, tu connais le nom donc :
//une vue pour retrouver l'enregistrement, ( tu pourrais aussi utiliser le select de la table, mais bon DataView custDV new DataView(set.Tables["score"], "nom 'Michou'", null, DataRowView nouveau =
if( custDV != null && custDV.count>0)
 // si la vue n'es pas vide
{ // je considère que cela ne m'a renvoyé qu'un élément
      custDV[0].BeginEdit();
      custDV[0]["time"] = 100;
      custDV[0].EndEdit();
}
 avant de fair le writeXml, il faut peut être faire un ;
set.AcceptChange()

Be happy , by
Tao
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007

Tous d'abord merci a toi de te pencher sur mon probléme mais voila j'ai bien lu ce que tu m'as ecri et j'ais pas tous compris ce que ca devait faire car j'ai oublié de le précissé je suis débutant en c# et donc je comprend pas tous trés vite lol.

Pourrais tu me donner plus de piste ou autre merci a toi.
Messages postés
346
Date d'inscription
lundi 8 septembre 2003
Statut
Membre
Dernière intervention
3 septembre 2007
3
Alors reprenons,

tu charges tout ton xml  dans un dataset  par DataSet set = new DataSet();
set.ReadXml("score.xml");

J'imagine que le dataset est déclaré en variable globale à ta form ou autre.

Tu affiches le contenu du fichier xml  en faisant :
this.dataGridView1.DataSource = set;
this.dataGridView1.DataMember = "score";

Quand tu veux ajouter un élément, tu fais :DataView custDV new DataView(set.Tables["score"], "nom 'Michou'", null, DataViewRowState.CurrentRows);

DataRowView nouveau = custDV.AddNew();
nouveau.Row["nom"] = "loutre";
nouveau.Row["time"] = 100;
nouveau.EndEdit();

set.WriteXml("score.xml");

Or, je pense et je suis sure qu'il est inutile de passer par une vue pour ajouter une ligne ( ou un utilisateur) dans la datatable score. Tu peux faire  comme suit  en écrivant dans la datatable :
DataRow nouvelUtilisateur = set.Tables["score"].NewRow();  // permet de déclarer une nouvelle ligne dans la table score
nouvelUtilisateur["nom"] = "loutre";
nouvelUtilisateur['time"] = 100;
set.Tables["score"].Add (nouvelUtilisateur);

Tu peux apres  soit écrire directement ce nouvel utilisateur dans ton xml avec set.WriteXml("score.xml"). Cette instruction recrée le fichier xml avec le contenu du dataset.

Tu m'a dit voouloir modifier le score d'un utilisateur, il faut donc aller le rechercher. Il faut donc aller chercher la ligne de la table score  pour pouvoir la modifier: DataView vueLigneAModif new DataView(set.Tables["score"], "nom 'Michou'", string.Empty,DataViewRowState.CurrentRows); // on peut faire autrement, mais cela fonctionne bien comme ca.

il faut ensuite vérifier que la ligne a été trouvée avant de la modifier :
if( vueLigneAModif != null && vueLigneAModif.count>0)
 // si la vue n'es pas vide
{ // je considère que cela ne m'a renvoyé qu'un élément
      vueLigneAModif[0].BeginEdit();
      vueLigneAModif[0]["time"] = 100;
      vueLigneAModif[0].EndEdit();
}

il faut ensuite valider les modifs  faite dans la table
set.AcceptChange();

// apres tu peux sauvegardere tes modifs dans le fichiers xml
set.WriteXml("score.xml");

pour trier  sur la colonne time , essai ca :

this.dataGridView1.DataSource = set;
this.dataGridView1.DataMember = "score";
this.dataGridView1.SortedColumn = this.dataGridView1.Columns[

"time"];this.dataGridView1.SortOrder =

SortOrder.Descending;

après, je peux pas faire grand chose de plus pour toi. Je peux pas expliquer plus je pense

Be happy , by
Tao
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007

Tous d'abord merci a toi tu m'as grandement fais avancé.

Sinon jai 2,3 erreurs qui sont intervenu aprés avoir essayé de refaire le code que tu m'as donné.

Deja pour la partie du trie a l'affichage pour les 2 lignes de code il me donne cette erreur que je ne comprend pas, faut il mettre une libraire particuliére enfin j'ai cherché et pas trouvé

erreur :

Erreur 1 La propriété ou l'indexeur 'System.Windows.Forms.DataGridView.SortedColumn' ne peut pas être assigné -- il est en lecture seule 

Sinon pour l'ajout d'un nouveau score j'ai essayé ta méthode mais sans succés car pour cette ligne de code "set.Tables[
"score"].Add(nouvelUtilisateur);" il me dit que Add ne contient pas de définition.

Mais sinon la mise  a jour d'un score mache nickel a part une petite question si je veux limité a 10 le nombre de score dans mon fichier xml faut que j'englobe mon code avec if
(
vueLigneAModif.Count<=10).

Merci a toi.
Messages postés
346
Date d'inscription
lundi 8 septembre 2003
Statut
Membre
Dernière intervention
3 septembre 2007
3
Pour l'erreur, il te dit que la propriété sortedcolumn ne peut pas être modifié,  donc que je me suis planté. Bon, j'ai regardé vite fait.
Bon, il faudrait regarder plus en détail les propirétés de la datagrid view. Solution tout de meme

Dataview vueTrie  = new DataView(set.Tables["score"], "", "time DESC",DataViewRowState.CurrentRows);
this.dataGridView1.DataSource = vueTrie;
this.dataGridView1.DataMember = "";

Pour le Add,  cela doit être AddNewRow  ( met ton curseur sur add dans ton code et clic sur ctrl+barre espace, il te donnera les fonction et propriétés possibles)

Pour la limitation du nombre de score , c'est pas sur la vue des lignes à modifier. Je pense que tu veux garder les dix meilleures. Donc, quand tu as un score, il faut : que tu regarde si le nom du type existe, Si il existe, le modifier, si iln'existe pas l'insérer et ensuite supprimer le score le plus bas.  Enfin, bon, c'est de l'algo ca, c'est pas du c#.  Tu fais alors une vue triée par score descendant, et tu supprime la 11 lignes si elle existe ( la vue est celle du début de message.

Be happy , by
Tao
Messages postés
86
Date d'inscription
mardi 18 janvier 2005
Statut
Membre
Dernière intervention
3 décembre 2007

Merci encore de t'impliqué ainsi.

Bon je ne comprend pas mais ca trie pas pourtant j'ai retourné le code comme pas possible et rien ny fais peut etre parceque j'affiche ca dans un DataGridView sinon tu as encore une idée je t'en remercie

Sinon jai essayé de trouvé ce qui pourrait etre utilisé avec Add mais a part NewRow qui ne marche pas jai rien trouvé d'equivalent.

Merci a toi pour ton aide.