Envoyé par : ygalr22
Date : 10/11/2006 10:30
Bonjour à tous, voila j'ai cherché dans le forum si la réponse à ma question n'y était pas par hazard et je suis donc obligé de me résigner à faire un petit post.
Alors attention je commence: J'ai un arbre pour lequel il y à 4 colone (pour l'instant seul les 2 premiere m'interesent: une de type checkbox et l'autre avec un label. L'arbre peut se déployer si l'on clique sur le '+' devant l'un de ces label (treechildren). L'arbre est remplis grace à un fichier rdf. Voici le code de l'arbre -->
<tree id='DataTree' flex="1" editable="true" width="200" >height="200" onselect="doSelect(event);" datasources="glpixul.rdf" ref="http://www.glpi.com/alltables"> <treecols> <treecol type="checkbox" label="" editable="true" /> <treecol id="name" label="Nom de champs" primary="true" flex="1"/> <treecol id="type" label="Type" flex="1"/> <treecol type="checkbox" label="tri" editable="true" flex="1"/> </treecols> <template> <rule> <treechildren> <treeitem uri="rdf:*"> <treerow> <treecell /> <treecell label="rdf:http://www.glpi.com/rdf/name"/> <treecell label="rdf:http://www.glpi.com/rdf/type"/> <treecell /> </treerow> </treeitem> </treechildren> </rule> </template> </tree>
Alors voila mon probleme c'est que dans un script j'aimerais pouvoir recuperer les id des'noms de champs' pour lequel la checkbox de la ligne est coché. Sachan que si un champ 'nom des champs' est déroulé pour laisser apparaitre le 'Type' et que celui ci est coché il faut que je puisse récuperer l'id du type et celui du nom des champs... Le HIC c'est que je n'arrive pas a appeler une fonction lorsque l'on coche une checkbox...
Pourtant je fais un truc comme: <treecol type="checkbox" label="" editable="true" oncommand="MaFonction();"/>
Pourquoi cela ne marche t-il pas il y a autre chose que oncommand?? Je suis désolé c'est peut etre pas tres clair mais j'ai pas énormément de temps pour mieux expliquer et puis c'est compliqué à mieux expliquer!! Merci d'avance pour votre aide.
Envoyé par : mistervince
Date : 10/11/2006 14:01
salut,
Essaye en ajoutant l'attribut
allowevents="true"
à ta balise <tree/>.
Ca permet de faire 'descendre' l'évènement clic vers les fils du tree. Peut-être que le problème vient de là.
Bon courage.
Envoyé par : ygalr22
Date : 10/11/2006 14:16
Ba j'ai essayé mais ca ne marche pas... Snif! Mé merci quand meme et si t'as d'autres idées n'ésites pas mistervince. Autrement je n'arrive pas a compter le nombres de lignes (non déroulées) qu'il y a dans mon tree j'a fait un ptit truc comme ca en JavaScript:
function test(Tree_id){ var nb_lignes=document.getElementById(Tree_id).childNodes.length; alert (nb_lignes); }
mais il me renvoi '3' alors que j'en ai bien 25... Ya t-il une methonde pour compter le nombre de lignes de l'arbre?
Envoyé par : Eric
Date : 10/11/2006 17:00
L'event n'est-il pas onCheckboxStateChange à la place de oncommand ?
Envoyé par : papy
Date : 10/11/2006 17:26
Pour le nombre de ligne c'est normal, regarde la section sur les arbres dans le tutorial principal Rapidement :
les balises à l'intérieur des arbres ne sont pas interprétées commes les autres balises XUL => c'est trop long et trop lourd alors que l'arbre se veut etre un composant léger et rapide.
Du coup celles qui sont présente sont parsées pour construire un objet en mémoire. C'est la même chose pour un arbre en RDF. Au final ton arbre dans le DOM ne contient pas les balises TreeCell.
Si tu veux agir sur les lignes et les cellules de ton arbre, regarde du côté des treeview : ce sont les composants qui stockent en mémoire le contenu de l'arbre.
function test(Tree_id) { var tree = document.getElementById(Tree_id); alert(tree.view.rowCount); }
Et pour ton problème initial tu peux peut etre utiliser aussi les treeview
function retest(Tree_id) { var tree = document.getElementById(Tree_id); var col = tree.columns.getColumnAt(0); //pour la première colonne var num = tree.view.rowCount; for(var i = 0; i < num; i++) { if(tree.view.getCellValue(i, col) == true) //case cochée else //case non cochée } }
Un lien utile ;) : http://www.xulplanet.com/references/xpco(..)
Enfin toutes les interfaces des arbres te serviront à ce niveau.
Envoyé par : ygalr22
Date : 13/11/2006 09:40
Ouai!! merci papy ca marche à peut pres ton truc, en tout cas pour le nombre de lignes ca marche supers ca c'est cool mais par contre pour mon probleme de savoir si la colone de type checkbox est cochée ou pas la ca marche pas : lorsque je fait une alert de tree.view.getCellValue(i, col)
alert(tree.view.getCellValue(i, col));
JS me renvoi rien du tout je comprends pas il devrai au moin renvoyer False ou '0' mais nan j'ai rien est ce que ca ne viendrait pas de la feuille de style un peut bizar sur la colone de type checkbox don voici le code incorporé à ma page xul :
<html:style> treechildren::-moz-tree-checkbox { /* css pour les cellules non cochées */ list-style-image: url(""); } treechildren::-moz-tree-checkbox(checked) { /* css pour les cellules cochées */ list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif"); } </html:style>
Merci de votre aide
Envoyé par : papy
Date : 13/11/2006 10:34
C'est étonnant que ca ne te renvoi rien. De mon côté j'utilise exactement ce code, mais avec des vues d'arbres personnalisés et non des vues d'arbres RDF, ca vient peut être de là mais ca m'étonnerais...
Le problème vient peut être d'une erreur lors de l'exécution de la fonction getCellValue, les paramètres que tu lui passes sont corrects ? (i est bien dans la plage [0,n[ et col est bien de type nsIColumn)
En passant je te conseille d'utiliser dump plutôt qu'alert. Son effet est le même : afficher son paramètre. En revanche il est affiché dans la console, et non dans une popup alert bloquante ce qui change beaucoup de chose ;)
Envoyé par : ygalr22
Date : 13/11/2006 10:45
les paramètres que tu lui passes sont corrects ? (i est bien dans la >plage [0,n[ et col est bien de type nsIColumn)
Heu... i est bien dans la plage 0,n ca c'est sur mais pour ce qui est de col comment je sais le type?? voici mon JS complet:
function Verif_Coche(Tree_id) { var cptcoch=0; var cptnoncoch=0; var tree = document.getElementById(Tree_id); var col = tree.columns.getColumnAt(0); //pour la première colonne var nb_lign = tree.view.rowCount; for(var i = 0; i < nb_lign; i++) { if(tree.view.getCellValue(i, col) == true){ //case cochée cptcoch=cptcoch+1; }else{ //case non cochée cptnoncoch=cptnoncoch+1; } } alert(cptcoch+' : cases cochées'); alert(cptnoncoch+' : cases non cochées'); }
Merci pour votre aide et votre temps perdu... ;-)
Envoyé par : papy
Date : 13/11/2006 11:10
Pour voir le type de ta variable col, essai un dump ou un alert
var col = ... dump(col); var nb_lign = ...
ou
var col = ... alert(col); var nb_lign = ...
Sinon c'est bien ta première colonne qui contient les cases à cocher ?
Envoyé par : ygalr22
Date : 13/11/2006 11:17
Merci pour la réponse rapide
Alors l'alert de col me renvoi : object TreeColumn
et oui c'est bien ma premiere colone qui est de type checkbox.
Aidez mwa ca m'énerve de bloquer sur un ptit truc comme ca!!! ;-)
Envoyé par : ygalr22
Date : 13/11/2006 11:35
Eric:
L'event n'est-il pas onCheckboxStateChange à la place de oncommand ?
Nan j'ai essayé ca à pas l'air de marcher... Mais si t'a une idée n'ésite pas!! Merci
Envoyé par : ygalr22
Date : 13/11/2006 13:51
Bon OK maintenant ca marche grace à votre aide, ou tout du moins en partie...
Maintenant j'aimerai bien que lorsque l'utilisateur coche une checkbox devant une ligne 'mère' les lignes 'filles' se déroulent et se coche automatiquement. Le seul probleme est que aucune action du style 'oncommand()' ou autre ne fonctionne sur la colone de type checkbox. J'a cherché un peut partout et je ne vois pas d'ou vien le pb... Aidez mois svp parceque là je nage vraiment!!
Merci d'avance.
PS: Pour ceux que ca peut interesser par la suite voici le code JS tel qu'il est maintenant: (la fonction test à été renomée en Verif_Coche)
//Fonction de vérification des cases cochées// function Verif_Coche(Tree_id) { var cptcoch=0; var cptnoncoch=0; var tree = document.getElementById(Tree_id);//objet arbre var col_chk = tree.columns.getColumnAt(0); //pour la première colonne de type checkbox var nb_lign = tree.view.rowCount;//compte le nombre de lignes visible dans l'arbre for(var i = 0; i < nb_lign; i++) {//boucle de 0 à nombre de lignes if(tree.view.getCellValue(i, col_chk) == 'true'){//si la valeur de la ligne i de la colone 0 est 'true' (checkbox cochée) //case cochée cptcoch=cptcoch+1; }else{//sinon //case non cochée cptnoncoch=cptnoncoch+1; } } alert(cptcoch+' : cases cochées'); alert(cptnoncoch+' : cases non cochées'); }
Envoyé par : papy
Date : 13/11/2006 14:24
OK pour le problème, très 'bête' on va dire, une chaine à la place d'un booleen... désolé de t'avoir induit en erreur sur ce coup la.
Pour ta selection automatique des lignes filles, je ne vois pas non plus de solution simple (ca ne veut pas dire qu'il n'y en a pas :P)
Voila en gros comment je ferais si besoin :
ajouter un gestionnaire d'évènement click à l'arbre avec onclick
<tree id="monArbre" ... onclick="gestionCoche(this, event);"> ... </tree>
dans ce gestionnaire :
function gestionCoche(tree, event) { //creation d'objets pour passage par reference var row = new Object(); var col = new Object(); var child = new Object(); //recuperation des infos sur la cellule clickée tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, col, child); //recuperation des valeurs passées par reference row = row.value; col = col.value; child = child.value; //si la cellule est dans une colonne de type checkbox if(col.type == Components.interfaces.nsITreeColumn.TYPE_CHECKBOX) { //on recupere l'etat et le niveau d'indentation de la cellule var etat = tree.view.getCellValue(row, col); var niveau = tree.view.getLevel(row); //on cherche toutes les lignes filles pour changer leurs valeurs var end = false; var i = row + 1; var l = tree.view.rowCount; while(i < l && !end) //si la cellule a un niveau <= a celle clické on a fini de parcourir les lignes filles if(tree.view.getLevel(i) <= niveau) end = true; //sinon on a une ligne fille else { tree.view.setCellValue(row, col, etat); } i++; } } }
Le petit détail à voir est : est-ce que le gestionnaire est apellé avant ou après que la case ai changée d'état ? En fonction de ca, il faut inverser ou non la valeur que l'on donne aux lignes filles.
Enfin voila, aux corrections pres parce que je n'ai pas tester ce code, ca devrait fonctionner je pense.
Envoyé par : ygalr22
Date : 13/11/2006 14:43
Ok ca marche nikel ya juste une ptit modif à faire : dans le while :
}else{ tree.view.setCellValue(i, col, etat); }
sinon les lignes filles ne sont pas cochées. C'est exactement ce que je commencait à faire mais j'avais pas pensé à faire le gestionnaire d'evenement sur un click sur l'arbre je voyais ca plus sur un click sur les checkbox... Encore merci à tout le monde ca fait plaisir de voir que l'on peut compter sur beaucoup de personnes pour nous aider (nous les débutants!!)
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.