J'ai modifié les "nodes" comme tu me l'as conseillé Nexaelia et actuellement il ne me reste plus qu'une seule erreur, au niveau du "Jeton" à l'instruction start=false;
Lorsque je la met en commentaire, cinq nouvelles erreurs apparaissent, parbleu!!
J'ai modifié les "nodes" comme tu me l'as conseillé Nexaelia et actuellement il ne me reste plus qu'une seule erreur, au niveau du "Jeton" à l'instruction start=false;
Lorsque je la met en commentaire, cinq nouvelles erreurs apparaissent, parbleu!!
Bonjour. Alors, avant de continuer sur la dernière erreur que tu as eu qui se transforme en 5 erreur, je vais reprendre ton message d'avant.
Sur ton XML, ce qu'on appelle "nœud" en langage commun est simplement une ligne.
Je pense que tu as du voir en développement ou programmation la notion de parents/enfants ...
SI je reprends ton XML, la première erreur que je vois est simple: bien que tu ai modifié comme je t'ai demandé, le nom des nœuds enfant (de second degré pour être pus précis),
tu as aussi mis le même nom pour le nœuds enfant (de premier degré qui est le parent des nœuds (lignes) contenant tes informations).
Ça peut arriver, mais dans ton cas tu n'aura pas grand chose car il lira le premier bloc "Frere" et pas ce qu'il y a à l'intérieur.
Modification:
-Pour les directives using c’est OK.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <?xml version="1.0" encoding="utf-8" ?> <Information xmlns: xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns: xsd="http://www.w3.org/2001/XMLSchema"> <TypeFrere> <Frere> actif="True" nom="Bim" prenom="Pierre" age="20" </Frere> <Frere> actif="True" nom="Bam" prenom="Paul" age="25" </Frere> <Frere> actif="True" nom="Boom" prenom="Jacques" age="30" </Frere> </TypeFrere> </Information>
-Dans le forum, essaie d'utiliser les boutons pour indenter ton code, je t'avouerai que c'est compliqué de suivre les accolades.
Celui là essaie de le déplacer (ctrl+x) après ton form1_load historie d'avoir plus de clarté et de pouvoir suivre le déroulement des événements.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Entrer votre nom"); String i = "Je suis Frank"; this.champtexte.Text = i.ToString(); }
-Tu peux supprimer ça, la seconde ligne est assez expressive:
-Ça aussi poubelle (ou alors si tu veux garder une trace de tes actions, tu peux créer une classe non applicative qui te servira de tutoriel).
Code : Sélectionner tout - Visualiser dans une fenêtre à part //xmlDoc.Load(@"C:\visual studio 2010\Projects\WindowsFormsApplication6\WindowsFormsApplication6\bin\Debug\XMLFile2.xml");
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 //itemNodes = xmlDoc.SelectNodes("//Information/Frere/Second"); //itemNodes = xmlDoc.SelectNodes("//Information/Frere/Dernier");Celui du dessus à simplifier par : // lecture du paramètre nom dans le nœud.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 //Ce qui veut dire: on se déplace donc en principe sur le premier nud, et dans ce premier nud, //On sélectionne l'attribut du nud, qui est le nom, et il le lit. //Donc arrivé à ta première ligne, tu te déplace d'un cran, le pointeur voit qu'il y a un attribut qu'il s'appelle nom="xy". //Le programme lit nom => xy
Ceci, tu peux le garder pour toi ou le raccourcir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 // Donc 1 ou 0 si on regarde en binaire, que tu mette : ? true : false ou l'inverse cela n'a pas d'incidence. //Parcontre => =="true" veut dire que par défaut la valeur est vrai donc cochée. //Pour les items en caractères et numéral, pas besoin de les définir, le tableau s'en charge automatiquement. //En effet c'est du text et le .Net Frameworks est plutôt sympa pour ça.
Et ça aussi:
Tu as bien créé ce bouton sur le concepteur de vue? si c'est pas le cas, tu le créé et tu coupe et colle le code qu'il y a dans
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 //actif est déjà paramétré au dessus, le reste est a paramétrer en valeur. //Tu peux ensuite en rajouter autant que tu veux en suivant ce schéma. //Le mien contient 14 colonnes avec divers types de paramétrage.
dans la fonction privée de ton bouton quitter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part private void button1_Click_1(object sender, EventArgs e)
L'erreur se trouve ici !
Une accolade de trop ici aussi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 XmlNode ageNode = itemNode.Attributes["Age"]; } // Enlève-moi cette accolade fermante, elle clos ta boucle prématurément donc le start n'est pas reconnu! if (actifNode != null) {
Et il me semble que ça devrait enlever des erreurs. arrivé là ce n'est pas fini mais c'est une méthode à comprendre, c'était le plus chiant je pense.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 start = false; } }//celle-ci
Merci Nexaelia, je n'ai plus que trois erreurs:
if (actifNode != null)
{
//bool pour les items à case-coche
bool actif = (actifNode.Value == "true") ? true : false;
dataGridView1.Rows.Add(actif, nomNode.Value, prenomNode.Value, ageNode.Value);
}
Il est écrit dans la liste des erreurs que "Le nom actifNode n'existe pas dans le contexte actuel"....
Tu as bien noté ceci après l'accolade ouvrante du foreach?
sans changer de police d'écriture et écris de la même manière dans le xml?
Code : Sélectionner tout - Visualiser dans une fenêtre à part XmlNode actifNode = itemNode.Attributes["actif"];
Je viens de regarder, et tu l'as pas fait, et si tu regardes dans des messages d'avant je te l'ai noté une première fois que tu l'avais oublié;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 foreach (XmlNode itemNode in itemNodes) { XmlNode actifNode = itemNode.Attributes["actif"]; XmlNode nomNode = itemNode.Attributes["nom"]; XmlNode prenomNode = intemNode.Attributes ["prenom"]; XmlNode ageNode = itemNode.Attributes ["age"]; if (actifNode != null) { //bool pour les items à case-coche bool actif = (actifNode.Value == "true") ? true : false; dataGridView1.Rows.Add(actif, nomNode.Value, prenomNode.Value, ageNode.Value);} } //En passant le start à faux, ou évite un éventuel bouclage accidentel. start = false; }
Ah merci Nexaelia, le code se compile enfin!
J'ai la dataGridView qui s'affiche et je peux même rentrer les informations.
Tu m'as tant appris et je crois que je vais relire gentiment tout le code et le refaire pour le saisir.
Je t'envoie ce bout de code...
while(true)
{
const string message ="Merci";
const string caption = "Merci";
MessageBox.Show(message, caption, MessageBoxButton.Ok);
}
Normalement tu devrais pouvoir le compiler dans ton private void Form1_Load()
Ce n'est pas fini. Il y a encore une fonction ou deux à ajouter pour que tu puisse sauvegarder en temps réel lors de la modification.
Si Actif est le premier paramètre dans ton XML tu fais +1 sur le iC, si il est le second c'est +2 ainsi de suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { //Actif if (!start) { int iC = e.ColumnIndex; // on compte les colonnes int iR = e.RowIndex; // on compte les lignes //Comme une bataille navale XmlNode itemNode = itemNodes.Item(iR); XmlNode nomNode = itemNode.Attributes[iC]; MessageBox.Show("Modification : " + dataGridView1.Rows[iR].Cells[iC].Value + ", " + iC + ", " + iR); // à tel colonne de tel ligne, une modification est apportée //On compte avec le compteur à iC + "1" car on déplace le curseur de deux colonnes pour modifier la valeur voulue à partir de l'origine. itemNode.Attributes[iC + 1].Value = dataGridView1.Rows[iR].Cells[iC].Value.ToString(); // l'ancienne valeur est remplacé par la nouvelle xmlDoc.Save("XMLFile3.xml"); //on sauvegarde à la saisie. }
Ici on utilise un pointeur avec coordonnées. C'est un peu compliqué à déchiffrer, si tu y comprends quelque chose c'est bien, si ce n'est pas le cas, tu peux me demander.
Mais tu verras vite qu'avec cette formule tu peux seulement modifier une colonne, or, il me semble que tu veux avoir la possibilité de modifier toutes les colonnes.
A partir de là, tu a le code pour un "switch case" mais c’est très restrictif, donc pour te mettre sur la voie, il faut que tu fasse un bouclage.
Précision sur la sauvegarde, ce que tu modifie est sauvegardé dans un fichier tierce, je n'ai pas vraiment la solution pour écraser le fichier de sortie sur l'ancien avec le même nom, avec la méthode XmlDocument.
Sur une autre méthode, cela fonctionne très bien, mais certaines méthodes ont leurs propriétés spécifiques. Il doit être possible de créer un ".ini" qui à l’exécution du programme serai en mesure de remplacer l'ancien fichier par le nouveau.
De plus bonne nouvelle, le nouveau fichier XML s'enregistre dans le \bin\debug.
Autre chose. Si jamais tu souhaite occasionnellement déplacer le nouveau fichier vers plusieurs ou un hôte distant. Tu peux le faire sans quitter l'application etc.. et le chercher.
Tu peux aussi ouvrir n'importe quel autre fichier XML une fois le nom configuré grâce au browser.
Cette fonction est générique, donc elle fonctionne toujours. il ne reste plus qu'a lui créer un bouton avec le même nom.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 private void opensearch_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { System.IO.StreamReader sr = new System.IO.StreamReader(openFileDialog1.FileName); MessageBox.Show(" " + sr.ReadToEnd()); sr.Close(); } }
Enfin imaginons, qu'en cours de route, tu souhaite visualiser un autre fichier XML. Tu l'as pris avec le browser et positionné dans le bon chemin. Sauf que tu est actuellement sur le premier.
Afin de de voir le second il faut court-circuiter le bouclage de l'application avec un restart (avec le browser par exemple ou un bouton tierce):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 DialogResult dialogResult = MessageBox.Show("Souhaitez-vous redémarrer l'application?", "Attention", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) Application.Restart();
Voilà. En principe ton application est fonctionnelle. Tu peux modifier une colonne entière. C'est peu, mais ça aide pour la suite.
Une fois que tu aura réfléchis et trouvé la solution à la boucle en XmlDocument, tu auras fini. Si tu ne trouve pas le système de bouclage
tout de suite c'est normal, il faut se tirer un peu les cheveux.
Si au bout de quelques jours, tu n'as toujours pas de résultats, on verra si j'ai quelque chose pour toi.
Ou alors au pire si ça te convient (mais j'y crois pas trop) tu peux poser le
++
Je ne comprends pas trop, j'ai "actif" un peu partout dans mon code xml:
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <?xml version="1.0" encoding="utf-8" ?> <Information xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <TypeFrere> <Frere> actif="True" nom="Bim" prenom="Pierre" age="20" </Frere> <Frere> actif="True" nom="Bam" prenom="Paul" age="25" </Frere> <Frere> actif="True" nom="Boom" prenom="Jacques" age="30" </Frere> </TypeFrere> </Information>
Le fichier tierce en question peut être un fichier texte (.txt) ou même un autre fichier xml...Ou même un Excel!
Y a t'il une différence entre :
et
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
?
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
Chez moi c'est le premier qui est marqué dans le code, j'ai du le remplacer avec le tien et lors de la compilation, il ne se passe rien dans le dataGridView. Et même le MessageBox.Show() ne s'affiche pas...
Avec ce que je t'ai donnée, tu pourra modifier la colonne Actif (True ou False) et sauvegarder,exemple:
Que tu ai 1 ou 45000 lignes il faut voir ca comme un jeu de bataille navalle.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <Frere> actif="True" nom="Boom" prenom="Jacques" age="30" </Frere> //rang 0 ..rang 1.......rang 2.........rang 3..................rang 4.......Fin // =iC+0..iC+1.........iC+2............iC+3....................iC+4.........Fin
actif="True" devient "False" avec la sauvegarde.
2. Nan le Form1_load est terminé après ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 start = false; }J'aurai tendance à dire non, c'est une méthode valable uniquement pour le XML. Tu peux bouger même une montagne mais tu ne pourra ouvrir que tu XML.Le fichier tierce en question peut être un fichier texte (.txt) ou même un autre fichier xml...Ou même un Excel!
Il ya un MessageBox.Show dans le DataGridView, donc je devrais m'attendre au moins à voir une fenêtre s'afficher non?
Et en plus, la sauvegarde n'est pas effective. Je suis allé dans le fichier Debug et je n'ai pas vu le fichier XMLFile3.xml .
Fais un screen du code que je t'ai donné dans ton code.
Voilà:
Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 private void button1_Click_1(object sender, EventArgs e) { DialogResult dialogResult = MessageBox.Show("Êtes-vous sûr de vouloir quitter l'application?", "Attention", MessageBoxButtons.YesNo); if (dialogResult == DialogResult.Yes) Application.Exit(); } private void dataGridView1_CellContentValueChanged(object sender, DataGridViewCellEventArgs e) { //Actif if (!start) { int iC = e.ColumnIndex; // on compte les colonnes int iR = e.RowIndex; // on compte les lignes //Comme une bataille navale //<Frere> actif="True" nom="Boom" prenom="Jacques" age="30" </Frere> //rang 0 ..rang 1.......rang 2.........rang 3..................rang 4.......Fin // =iC+0..iC+1.........iC+2............iC+3....................iC+4.........Fin XmlNode itemNode = itemNodes.Item(iR); XmlNode nomNode = itemNode.Attributes[iC]; MessageBox.Show("Modification : " + dataGridView1.Rows[iR].Cells[iC].Value + ", " + iC + ", " + iR); // à tel colonne de tel ligne, une modification est apportée //On compte avec le compteur à iC + "1" car on déplace le curseur de deux colonnes pour modifier la valeur voulue à partir de l'origine. itemNode.Attributes[iC + 1].Value = dataGridView1.Rows[iR].Cells[iC].Value.ToString(); // l'ancienne valeur est remplacé par la nouvelle xmlDoc.Save("XMLFile3.xml"); //on sauvegarde à la saisie. } } private void opensearch_Click_1(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { System.IO.StreamReader sr = new System.IO.StreamReader(openFileDialog1.FileName); MessageBox.Show(" " + sr.ReadToEnd()); sr.Close(); } }
Je peux rentrer le nom, le prenom et l'age mais la modification ne s'effectue pas!
Essaie à iC+2, peut-être un problème de comptage.
Désolé Nexaelia, mais même avec IC+2 (ou IC+3) rien ne marche comme ca devrait
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager