Menu en XML...comment faire?

Résolu
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008 - 20 avril 2005 à 15:13
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 22 avril 2005 à 15:23
Salut tout le monde...
J'ai un souci avec un fichier XML...alors je suis sous Visual C# et j'ai un menu composé de 3 boutons, de 3 linklabels et d'un listBox...ce que j'aimerais faire, c'est que les textes affichés tant sur les boutons que par les linkabels que dans la listbox soient piochés dans un fichier XML...le hic c'est que je ne sais pas comment m'y prendre ! je découvre le XML et ai déjà épluché 2 tuto et demi (le 3eme est en cours...) mais je reste un peu dans le flou...de même j'ai trouvé une très bonne description des classes XmlTextReader et XmlTextWriter ici : http://www.supinfo-projects.com/2003/xml%5Fcsharp/0/
mais avant de me lancer dans ça je voudrais être sûr que mon fichier est correct...enfin s'il s'organise bien...je vous le présente, si vous pouviez me dire les problèmes qu'il y a svp...merci beaucoup

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- ce fichier XML donne l'arborescence du menu -->
<menu_rech>

<rech_msgs>Recherche de Messages
<mots_clefs>Par Mots Clefs</mots_clefs>
<texte_libre>Par Texte Libre</texte_libre>
<statut>Par Statut</statut>
<list_interf>Liste des Interfaces
<contenu_liste>SELECT interf FROM interface;</contenu_liste>
</list_interf>
</rech_msgs>

<gest_abonnes>Gestion des Abonnés</gest_abonnes>

</menu_rech>

Merci pour toutes remarques,aides, je suis vraiment débutant et je ne vois pas du tout comment m'y prendre pour effectuer cette initialisation du menu via ce fichier...

"Un seul Être vous manque, et tout est dépeuplé..."

20 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 avril 2005 à 15:53
Si c'est juste pour afficher des libelles dans tes boutons ou labels,
tu devrais peut-etre plutot utiliser des ressources, ce serait plus
judicieux je pense.

Par contre, si apres tu dois utiliser ton fichier XML pour une autre raison, j'ai rien dit ^^



Bon, sinon ton fichier, je l'aurais plutot vu comme ca :

<menu_rech>

<rech_msgs str="Recherche de Messages">


<typ_rech>Par Mots Clefs</typ_rech>


<typ_rech>Par Texte Libre</typ_rech>


<typ_rech>Par Statut</typ_rech>

</rech_msgs>

<list_interf>Liste des Interfaces


<contenu_liste>SELECT interf FROM interface;</contenu_liste>

</list_interf>

<gest_abonnes>Gestion des Abonnés</gest_abonnes>

</menu_rech>



Mais je peux me tromper, et puis tout depend de comment tu as envie d'organiser tes données


Mx
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 avril 2005 à 16:36
Les ressources c'est assez simple a utiliser.

Le principe : un identifiant = une chaine



Si tu utilises Visual studio :

Il te faut creer un fichier .resource ou .resx dans ton projet. Les
fichiers ressources seront "integres" dans ton exe (ou ta dll) a la
compilation.

Quand tu ouvres le fichier ressource, tu as le droit a un tableau avec
plusieurs champs. Le champ name l'identifiant, le champ value la
chaine que tu veux mettre



Ainsi, mettons par exemple :

Name = monButton

Value = Coucou



Ensuite dans le code de ton appli, rajoute les 2 espaces de nom comme suit :

using System.Resources;

using System.Reflection;



Pour acceder aux ressources, il faut un ResourceManager

private ResourceManager rm ;



Et ensuite tu l'instancies comme ca :



rm = new ResourceManager("WindowsApplication1.Resource1", Assembly.GetExecutingAssembly());



Il faut que tu remplaces WindowsApplication1.Resource1 par

[l'espace de nom de ton application].[Le nom de ton fichier ressource sans l'extension]



Et ensuite, pour acceder a une chaine



Button bt1 = new Button(); // je crée un bouton pour l'exemple

bt1.Text = rm.GetString("monButton"); // Demande au ResourceManager d'aller chercher la valeur "monBoutton"


Et roule



Les ressources te permettent aussi d'integrer toutes sortes de fichiers
(sons, images), et presentent aussi l'immense interet de permettre de
localiser les applis, c'est a dire, pour une meme appli, avoir
plusieurs langues, sans avoir a modifier quoique ce soit dans le code.



N'hésite pas a demander, si tu as des questions.

Mx
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 avril 2005 à 11:06
Je pense pas que ca pose un souci de mettre ta requete de type string,
puisque dans ton code, elle sera de type string aussi (Par exemple, si
tu utilises une instance d'objet OleDbcommand, la prorpiété CommandText
(qui correspond a la requete) est de type string.



Mais pourquoi ne pas la mettre en dur dans ton code ?

Mx
1
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
20 avril 2005 à 16:05
décidément tu me sers de dictionnaire universel MX !
bah en fait, a l'affichage, j'ai 2 boutons dispo:

Recherche de Messages
Gestion des Abonnés

mais quand on clique sur le premier, ca fait un sous-menu avec les 3 linklabels et le 3eme boutons...voilà le schéma de mon menu

Recherche de Messages
Par Mots Clefs
Par Texte Libre
Par Statut

Liste des Interfaces
<là ma listBox>

Gestion des Abonnés

le truc, c'est que ce menu doit être dynamique pour qu'au cas où y'ai besoin de changer/ajouter des trucs ben ce soit faut dans le fichier xml plutot que dans le code directement....ce qui m'a amené a cette question: est-ce que cela veut dire que je dois implémenter mes boutons et leurs actions dans mon fichier XML aussi...?? :s:s auquel cas ce serait bien bien chiant, je reconnais...:( si je peux faire autremet ça serait mieux...
merci pour tes corrections, mais tu vois justement quand je dis que je suis perdu dans le XML c que je comprends pas très bien les balises à valeur...genre ton str ca donne le nom du groupe parent qui aura les 3 type-rech comme enfant, c bien ca...? et si oui, c bien cette chaine qui sera prise en compte lors de la lecture du fichier par XmlTextReader ? et encore une fois, si on continue par là, si ce que j'ai dit est correct, est-ce que la fonction va savoir prendre ce qu'il ya ENTRE les balises type_rech dans les fils...?
(je sais pas si c bien bien clair tout ca lol)

merci (encore!) en tous cas...tu m'aides beaucoup ;)

"Un seul Être vous manque, et tout est dépeuplé..."
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 avril 2005 à 16:17
Ma question est : est-ce que ce contenu du fichier est succeptible de
changer plus tard ?(je parle pas de pendant la phase de développement,
où là je me doute que c'est censer changer)

C'est a dire, par exemple, est ce qu'il peut y avoir avec le temps, d'autres balises comme :

Par Mots Clefs
Par Texte Libre
Par Statut




Et donc, est ce que ca va impliquer l'ajout dynamique de linklabel sans avoir a retoucher le code?

Ou alors, s'il y a des changements, est-ce que tu penses que ce sera avec recompilation du code ?

Parce que je pense vraiment que dans ton cas, il faut utiliser des
ressources, et que ca ne sert a rien de s'embeter avec du xml.



le "str", c'est ce qu'on appele un attribut. je l'ai mis la parce qu'il
concerne les 3 noeuds enfants. Maintenant, j'ai fait ca intuitivement,
je saurais pas t'expliquer la raison de "pourquoi il faut faire comme
ca" ;)


Mx
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
20 avril 2005 à 16:22
lol ok ok je pense que ton intuition est proche de celle du HTML enfin je pense avoir compris mais je ne suis pas spécialement capable d'expliquer non plus...enfin bref
oui je pense que des ressources seraient mieux car je pense qu'il n'y aura pas de modification dynamique sans recompilation...enfin je pense pas que ce soit nécessaire quoi...donc oui pour les ressources...mais...comment fait-on ça avec des ressources au fait...? :-$
merci

"Un seul Être vous manque, et tout est dépeuplé..."
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
21 avril 2005 à 11:01
hmm...merci pour ta réponse...je vois comment ça simplifie vis-à-vis du XML, mais j'ai eu un peu de mal à m'en servir...toutefois j'y suis enfin arrivé ! Je vais décrire au cas où ça pourrait intéresser quelque personne que ce soit...voilà ce que j'ai fait...

- J'ai ajouté un fichier ressource à mon projet
- J'ajoute les 2 using que tu m'as cités (System.Reflection & System.Resources)
- Je déclare le RessourceManager dans la classe de mon appli
- J'ai rempli les champs de cette façon:
<name> <value> <type>
Bttn_RechMess Recherche de Messages System.String
LnkLabl_MotsClefs Par Mots Clefs System.String
. . . . . . . . . . . . . . .
- J'instancie le ResourceManager dans le constructeur
- Lorsque j'ai besoin d'afficher mes boutons/linklabels, c'est-à-dire lorsque je lance la connexion, je demande AVANT de les rendre Visibles (Visible=true) d'aller chercher les valeurs correspondantes dans le fichier de ressources
- Je lance mon application, et ça marche...

Je te remercie beaucoup ! ça m'aide considérablement !
Il ne me reste qu'à effectuer différents tests pour savoir si tout marche vraiment bien, a priori je dirais que oui...mais on n'est jamais trop prudent...

Il me reste quand même une dernière question:
pour la ListBox contenant une liste d'interfaces, je dois obtenir cette liste via une requête sur une base...Est-ce que mettre dans le fichier de ressource comme valeur "SELECT blabla etc" et mettre en type String auquel cas devrais-je faire une manip' particulière? ou dois-je m'y prendre autrement...? c'est la grosse interrogation qui demeure...

Merci encore!

"Un seul Être vous manque, et tout est dépeuplé..."
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
21 avril 2005 à 14:14
oui, j'y avais pensé mais si y'a besoin de changer la requête par la suite, c'est peut-être mieux de la laisser dans la config externe...ca assure une certaine pérènité de l'appli, nan? enfin sinon j'la mets dedans, c'est pas un GRAVE probleme c'est simplement un souci de portabilité temporelle :) (ohh que de grands mots! lol)

"Un seul Être vous manque, et tout est dépeuplé..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 avril 2005 à 14:18
Y'a pas grande différence. Dans les 2 cas tu vas devoir recompiler ton application.

Donc c'est a toi de faire comme tu preferes :p

Mx
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
21 avril 2005 à 14:22
ouais c'est vrai en fait...chu bete...lol j'ai pas réfléchi surce coup là ...

"Un seul Être vous manque, et tout est dépeuplé..."
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
22 avril 2005 à 12:41
euuh...maître...j'ai encore un souci...
Voilà en fait j'ai une listeBox à remplir en dynamique aussi, enfin il faut que les éléments soient pris dans le fichier de ressources...Voilà le remplissage normal d'une ListBox



this.ComboBox_ListeBDD.Items.AddRange(
new
object[] {


"BASE N°1 ",


"BASE N°2 ",


"BASE N°3 ",


"... ... ... "});

voilà ce que j'ai essayé:


ComboBox_ListeBDD.Items.AddRange(
new
object[] {resManag.GetString("ComboBox_ListeBDD")});

sachant que dans mon fichier Resource.rscx j'ai mis:

<name> <value>
ComboBox_ListeBDD "BASE N°1 ", etc etc,"... ... ... "

tous les types sont en System.String...

le problème c'est qu'il n'y a qu'une ligne avec TOUT dans ma Liste...je voudrais savoir si c'est possible de réussir à faire qu'avec la String il reprenne toutes les bases...merci...

"Un seul Être vous manque, et tout est dépeuplé..."
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
22 avril 2005 à 12:45
oups...bon on va la refaire hein....y'a un peu trop d'indéntation là ...

normalement:

this.ComboBox_ListeBDD.Items.AddRange(
new
object[] {


"BASE N°1 ",


"BASE N°2 ",


"BASE N°3 ",


"... ... ... "});


ce que j'ai fait:

ComboBox_ListeBDD.Items.AddRange(new
object[] {resManag.GetString("ComboBox_ListeBDD")});

ah oui et je précise...ce que j'ai fait, c'est dans le constructeur après l'appel de InitializeComponent(), dans laquelle j'ai viré le remplissage de liste...

"Un seul Être vous manque, et tout est dépeuplé..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 avril 2005 à 12:46
Tes libelles sont séparés par des virgule ?

Parce que sinon, tu fait

string[] mesLignes = leStringDesRessources.Split(',');



et tu recupérera un tableau de strings

mesLignes[0] = "Base 1 ..."

mesLignes[1] = "Base 2..."



etc.

Mx
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
22 avril 2005 à 13:01
donc tu voudrais que je fasses un truc du genre
string[] lstBDD = resManag.GetString("ComboBox_ListeBDD").Split(',');

et ensuite:
tant que ??
{
ComboBox_ListeBDD.Items.AddRange(lstBDD[i]);
i++;
}

mais dans le tant que, je sais pas dire "tant que lstBDD[i] existe"...

sinon est-ce que j'ai bien compris le principe ? :)

"Un seul Être vous manque, et tout est dépeuplé..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 avril 2005 à 13:23
for(int i = 0; i < lstBDD.Length; i++)

ComboBox_ListeBDD.Items.Add(lstBdd[i]);

Mx
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
22 avril 2005 à 14:05
OK! ben merci encore, je vais tester ça et je te tiens au courant :-)
merci de ton aide !

"Un seul Être vous manque, et tout est dépeuplé..."
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
22 avril 2005 à 15:15
c'est cool ca marche merci! sauf qu'il me reste un petit problème que je n'arrive pas à localiser...
voilà le code:

string [] lstBDD = resManag.GetString("ComboBox_ListeBDD").Split(',');



for (
int i=0; i<lstBDD.Length; i++)


{


ComboBox_ListeBDD.Items.Add(lstBDD[i]);


}

et le résultat dans la ComboBox:

BASE N°1 ,BASE N°2 ,BASE N°3 ,... ... ...
BASE N°1
BASE N°2
BASE N°3
... ... ...

(les couleurs c pour différencier les lignes...la couleur change <=> c'est la ligne suivante...)

"Un seul Être vous manque, et tout est dépeuplé..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 avril 2005 à 15:18
Tu dois avoir oublié d'enlever une ligne de ton ancien code qui ajoute
BASE N°1 ,BASE N°2 ,BASE N°3 ,... ... ...

a ton combobox non ?



genre cette ligne la :

ComboBox_ListeBDD.Items.AddRange(new

object[] {resManag.GetString("ComboBox_ListeBDD")});






Mx
0
sphaxslayer Messages postés 216 Date d'inscription mardi 5 avril 2005 Statut Membre Dernière intervention 17 septembre 2008
22 avril 2005 à 15:21
effectivement j'suis stupide...mais t'as l'air de t'y connaitre en gens stupides lol t'as trouvé pile la connerie que j'avais faite :$ ou alors c a force d'm'aider lol
merci en tous cas ça marche maintenant!

"Un seul Être vous manque, et tout est dépeuplé..."
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
22 avril 2005 à 15:23
J'voyais que ca comme raison

a+


Mx
0
Rejoignez-nous