Lors de l'octroi d'autorisations, les fonctions suivantes sont principalement implémentées :
1. Si le nœud est accessible, son nœud parent doit également être accessible ;
2. Si le nœud est accessible, ses nœuds enfants sont également accessibles ;
3. Si le nœud est inaccessible, ses nœuds enfants sont également inaccessibles.
Utiliser une structure numérique avec CheckBox peut offrir une bonne expérience utilisateur, mais la difficulté de programmation est également un peu accrue si tout est fait par le serveur, cela ne fonctionnera certainement pas si vous cliquez dessus. Vous ne pouvez utiliser que javascript. , ce qui est frustrant lors du débogage avec javascript. Très, une classe de mots et une récursion frustrante. J'avais l'habitude d'utiliser la méthode suivante.
<langage de script="javascript">
<!--
//Initialiser le nœud
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
//Initialiser le nœud sélectionné
fonction initchecknode (arbre, valeur tv)
{
//Récupère la chaîne du nœud qui doit initialiser l'état de sélection.
var selectedNodes = tvvalue;
var arrayNodes = new Array();
arrayNodes = selectedNodes.split(",");
var AllRootNode=nouveau tableau();
AllRootNode=document.getElementById(tree).getChildren();
//Initialise le nœud sélectionné
findAndCheckedNodes(AllRootNode,arrayNodes);
}
//Initialiser le nœud sélectionné en fonction de la chaîne du nœud sélectionné
fonction findAndCheckedNodes (NodeArray, nodeDatas)
{
// alerte (NodeArray.length);
si (parseInt (NodeArray.length) ==0)
{
retour;
}
autre
{
pour(var i=0;i<parseInt(NodeArray.length);i++)
{
var cNode, nodeData;
cNode=NodeArray[i];
////Si le nœud est dans nodeDatas, initialize vérifié = true ;
nodeData = cNode.getAttribute("NodeData");
pour(var j=0;j<nodeDatas.length;j++)
{
si (nodeDatas[j] == nodeData)
{
cNode.setAttribute("checked","true");
casser;
}
}
//S'il y a des nœuds enfants, continuez la récursion
si(parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
//événement de contrôle
fonction tree_oncheck(arbre)
{
var je;
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(noeud,Pchecked);
setParent(noeud,Pchecked);
//window.alert(Pchecked);
document.all.checked.value = "";
si (arbre.getChildren().length > 0)
{
pour (i=0;i<=tree.getChildren().length-1;i++)
{
if (tree.getChildren()[i].getAttribute("Checked"))
{
AddChecked(tree.getChildren()[i]);
}
FindCheckedFromNode(tree.getChildren()[i]);
}
}
}
//Définir
la fonction de sélection du nœud enfant setcheck(node,Pchecked)
{
var je;
var ChildNode=nouveau tableau();
ChildNode=node.getChildren();
si (parseInt (ChildNode.length) ==0)
{
retour;
}
autre
{
pour(i=0;i<ChildNode.length;i++)
{
var cNoeud ;
cNode=EnfantNode[i];
cNode.setAttribute("Vérifié",Pvérifié);
//cNode.Checked = Pchecked ;
si(parseInt(cNode.getChildren().length)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
//Définir la sélection/annulation du nœud enfant ;
//En même temps, le statut du nœud parent doit être défini (s'il est désélectionné, seul ce nœud et tous ses contacts sont définis, et les contacts parents ne sont pas impliqués)
fonction setParent (nœud, Pc)
{
var parentNode = node.getParent();
si (nœud parent)
{
var parentNodeFather = parentNode.getParent();
si (parentNodePère)
{
setParent(parentNode,Pc);
}
si (Pc)
{parentNode.setAttribute("checked",Pc);}
autre
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//Vérifie si le sous-contact est sélectionné, si un est sélectionné, renvoie vrai
//Vérifie uniquement les nœuds de premier niveau.
fonction checkBrother (parentNode, Pc, NodeData)
{
var childNodes = new Array();
childNodes = parentNode.getChildren();
si (childNodes.length >0)
{
var bChecked = vrai ;
pour(var i=0;i<childNodes.length;i++)
{
if(childNodes[i].getAttribute("checked") == true && childNodes[i].getAttribute("NodeData") != NodeData)
{
//alerte(i+childNodes[i].getAttribute("Texte"));
bVérifié = faux ;
casser;
}
}
si (bVérifié)
{
parentNode.setAttribute("vérifié",Pc);
}
autre
{
//Sélectionne tous les nœuds parents
setParent(parentNode,!Pc)
}
}
autre
{
parentNode.setAttribute("vérifié",Pc);
}
}
//Obtenir l'état de tous les nœuds
fonction FindCheckedFromNode (nœud)
{
var je = 0;
var nœuds = new Array();
nœuds = nœud.getChildren();
pour (i = 0; i <= nodes.length - 1; i++)
{
if (nodes[i].getAttribute("Checked"))
{
AddChecked(nœuds[i]);
}
if (parseInt(nodes[i].getChildren().length) != 0 )
{
FindCheckedFromNode(noeuds[i]);
}
}
}
//Ajouter le nœud sélectionné
fonction AddChecked (nœud)
{
document.all.checked.value += node.getAttribute("NodeData") + ",";
}
//-->
</script>Cette méthode a un gros problème, c'est-à-dire que le CheckBox défini par le client ne peut pas être obtenu côté serveur. Désormais, il ne peut parcourir l'arborescence que pendant le contrôle et mettre la valeur Checked dans un texte, puis le soumettre. le serveur, puis le serveur analysera les caractères 1@2 @
Maintenant, j'utilise asp.net2.0 et j'utilise la méthode suivante
fonction public_GetParentByTagName (élément, tagName)
{
var parent = element.parentNode;
var upperTagName = tagName.toUpperCase();
//Si cet élément n'est pas la balise souhaitée, continuez à remonter
while (parent && (parent.tagName.toUpperCase() != upperTagName))
{
parent = parent.parentNode ? parent.parentNode : parent.parentElement;
}
parent de retour ;
}
//Définit le nœud parent du nœud Cheched - si le nœud est accessible, son nœud parent doit également être accessible
fonction setParentChecked (objNode)
{
var objParentDiv = public_GetParentByTagName(objNode,"div");
if(objParentDiv==null || objParentDiv == "indéfini")
{
retour;
}
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("Noeuds"));
objID = objID+"CheckBox";
var objParentCheckBox = document.getElementById(objID);
if(objParentCheckBox==null || objParentCheckBox == "indéfini")
{
retour;
}
if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox")
retour;
objParentCheckBox.checked = true ;
setParentChecked(objParentCheckBox);
}
//Désactivez le nœud enfant du nœud - si le nœud est inaccessible, ses nœuds enfants le seront également.
fonction setChildUnChecked (divID)
{
var objchild = divID.children;
var count = objchild.length;
pour(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
{
tempObj.checked = false;
}
setChildUnChecked(tempObj);
}
}
//Définit le nœud enfant du nœud comme coché - si le nœud est accessible, ses nœuds enfants sont également accessibles
fonction setChildChecked (divID)
{
var objchild = divID.children;
var count = objchild.length;
pour(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
{
tempObj.checked = true;
}
setChildChecked(tempObj);
}
}
//événement déclencheur
fonction CheckEvent()
{
var objNode = event.srcElement;
if(objNode.tagName!="INPUT" || objNode.type!="checkbox")
return;
if(objNode.checked==true)
{
setParentChecked(objNode);
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Nodes");
if(objParentDiv==null || objParentDiv == "indéfini")
{
retour;
}
setChildChecked(objParentDiv);
}
autre
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Nodes");
if(objParentDiv==null || objParentDiv == "indéfini")
{
retour;
}
setChildUnChecked(objParentDiv);
}
}Le plus grand avantage de cette méthode est que le serveur peut obtenir la valeur Checked définie par javascript. Il n'est pas nécessaire de télécharger toutes les arborescences sans cliquer. Vous pouvez simplement les télécharger une fois sur le serveur.
// Traverser les nœuds enfants
public void GetChildNode (nœud TreeNode)
{
foreach (nœud TreeNode dans Node.ChildNodes)
{
if (node.Checked)
{
StrChecked += node.Value+"@";
}
GetChildNode(nœud);
}
}
}Je peux toujours obtenir sa valeur de contrôle