asp.net 2.0权限树的控制2010-12-10做权限的时候,主要实现如下功能1、该节点可以访问,则他的父节点也必能访问;2、该节点可以访问,则他的子节点也都能访问;3、该节点不可访问,则他的子节点也不能访问。使用带CheckBox的数型结构能得到很好的用户体验,可是的难度也是有点增加,如果全部有服务端来完成,那点下刷下,肯定不行,只能使用javascript,javascript调试的时候郁闷的很,一个字类,还有郁闷的递归,麻烦我以前是使用以下该方法<script language="javascript"> <!-- //初始化节点 initchecknode(document.all("tvItemClientID").value,document.all("checked").value) //初始化选中节点 function initchecknode(tree,tvvalue) { //获得需要初始化选择状态的节点的字符串. var selectedNodes = tvvalue; var arrayNodes = new Array(); arrayNodes = selectedNodes.split(","); var AllRootNode=new Array(); AllRootNode=document.getElementById(tree).getChildren(); //初始化选择的节点 findAndCheckedNodes(AllRootNode,arrayNodes); }
//根据已选择的节点的字符串初始化选择的节点 function findAndCheckedNodes(NodeArray,nodeDatas) { //alert(NodeArray.length); if(parseInt(NodeArray.length)==0) { return; } else { for(var i=0;i<parseInt(NodeArray.length);i++) { var cNode,nodeData; cNode=NodeArray[i]; ////如果该节点在nodeDatas里则初始化checked = true; nodeData = cNode.getAttribute("NodeData"); for(var j=0;j<nodeDatas.length;j++) { if(nodeDatas[j] == nodeData) { cNode.setAttribute("checked","true"); break; } } //如果有子节点,则继续递归 if(parseInt(cNode.getChildren().length)!=0) findAndCheckedNodes(cNode.getChildren(),nodeDatas); } } } //--> //oncheck事件 function tree_oncheck(tree) { var i; var node=tree.getTreeNode(tree.clickedNodeIndex); var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked"); setcheck(node,Pchecked); setParent(node,Pchecked); //window.alert(Pchecked); document.all.checked.value = ""; if (tree.getChildren().length > 0) { for (i=0;i<=tree.getChildren().length-1;i++) { if (tree.getChildren()[i].getAttribute("Checked")) { AddChecked(tree.getChildren()[i]); } FindCheckedFromNode(tree.getChildren()[i]); } } } //设置子节点选中
function setcheck(node,Pchecked) { var i; var ChildNode=new Array(); ChildNode=node.getChildren(); if(parseInt(ChildNode.length)==0) { return; } else { for(i=0;i<ChildNode.length;i++) { var cNode; cNode=ChildNode[i]; cNode.setAttribute("Checked",Pchecked); //cNode.Checked = Pchecked; if(parseInt(cNode.getChildren().length)!=0) { setcheck(cNode,Pchecked); } } } }
//设置子节点选中/取消; //同时需要设置父节点的状态(如果是取消选中的话,仅仅设置本节点及其所有字接点,不涉及父接点) function setParent(node,Pc) { var parentNode = node.getParent(); if(parentNode) { var parentNodeFather = parentNode.getParent(); if(parentNodeFather) { setParent(parentNode,Pc); } if(Pc) {parentNode.setAttribute("checked",Pc);} else { checkBrother(parentNode,Pc,node.getAttribute("NodeData")) } } }