做权限的时候主要实现如下功能
该节点可以访问则他的父节点也必能访问
该节点可以访问则他的子节点也都能访问
该节点不可访问则他的子节点也不能访问
使用带CheckBox的数型结构能得到很好的用户体验可是编程的难度也是有点增加如果全部有服务端来完成那点下刷下肯定不行只能使用javascriptjavascript调试的时候郁闷的很一个字类还有郁闷的递归麻烦
我以前是使用以下该方法
<script language=javascript>
<!
//初始化节点
initchecknode(documentall(tvItemClientID)valuedocumentall(checked)value)
//初始化选中节点
function initchecknode(treetvvalue)
{
//获得需要初始化选择状态的节点的字符串
var selectedNodes = tvvalue;
var arrayNodes = new Array();
arrayNodes = selectedNodessplit();
var AllRootNode=new Array();
AllRootNode=documentgetElementById(tree)getChildren();
//初始化选择的节点
findAndCheckedNodes(AllRootNodearrayNodes);
}
//根据已选择的节点的字符串初始化选择的节点
function findAndCheckedNodes(NodeArraynodeDatas)
{
//alert(NodeArraylength);
if(parseInt(NodeArraylength)==)
{
return;
}
else
{
for(var i=;i<parseInt(NodeArraylength);i++)
{
var cNodenodeData;
cNode=NodeArray[i];
////如果该节点在nodeDatas里则初始化checked = true;
nodeData = cNodegetAttribute(NodeData);
for(var j=;j<nodeDataslength;j++)
{
if(nodeDatas[j] == nodeData)
{
cNodesetAttribute(checkedtrue);
break;
}
}
//如果有子节点则继续递归
if(parseInt(cNodegetChildren()length)!=)
findAndCheckedNodes(cNodegetChildren()nodeDatas);
}
}
}
//>
//oncheck事件
function tree_oncheck(tree)
{
var i;
var node=treegetTreeNode(treeclickedNodeIndex);
var Pchecked=treegetTreeNode(treeclickedNodeIndex)getAttribute(checked);
setcheck(nodePchecked);
setParent(nodePchecked);
//windowalert(Pchecked);
documentallcheckedvalue = ;
if (treegetChildren()length > )
{
for (i=;i<=treegetChildren()length;i++)
{
if (treegetChildren()[i]getAttribute(Checked))
{
AddChecked(treegetChildren()[i]);
}
FindCheckedFromNode(treegetChildren()[i]);
}
}
}
//设置子节点选中
function setcheck(nodePchecked)
{
var i;
var ChildNode=new Array();
ChildNode=nodegetChildren();
if(parseInt(ChildNodelength)==)
{
return;
}
else
{
for(i=;i<ChildNodelength;i++)
{
var cNode;
cNode=ChildNode[i];
cNodesetAttribute(CheckedPchecked);
//cNodeChecked = Pchecked;
if(parseInt(cNodegetChildren()length)!=)
{
setcheck(cNodePchecked);
}
}
}
}
//设置子节点选中/取消;
//同时需要设置父节点的状态(如果是取消选中的话仅仅设置本节点及其所有字接点不涉及父接点)
function setParent(nodePc)
{
var parentNode = nodegetParent();
if(parentNode)
{
var parentNodeFather = parentNodegetParent();
if(parentNodeFather)
{
setParent(parentNodePc);
}
if(Pc)
{parentNodesetAttribute(checkedPc);}
else
{
checkBrother(parentNodePcnodegetAttribute(NodeData))
}
}
}
//检查子接点是否有选择的如果有一个选择了那返回true
//只查第一级节点
function checkBrother(parentNodePcNodeData)
{
var childNodes = new Array();
childNodes = parentNodegetChildren();
if(childNodeslength >)
{
var bChecked = true;
for(var i=;i<childNodeslength;i++)
{
if(childNodes[i]getAttribute(checked) == true && childNodes[i]getAttribute(NodeData) != NodeData)
{
//alert(i+childNodes[i]getAttribute(Text));
bChecked = false;
break;
}
}
if(bChecked)
{
parentNodesetAttribute(checkedPc);
}
else
{
//所有父结点选择
setParent(parentNode!Pc)
}
}
else
{
parentNodesetAttribute(checkedPc);
}
}
//获取所有节点状态
function FindCheckedFromNode(node)
{
var i = ;
var nodes = new Array();
nodes = nodegetChildren();
for (i = ; i <= nodeslength ; i++)
{
if (nodes[i]getAttribute(Checked))
{
AddChecked(nodes[i]);
}
if (parseInt(nodes[i]getChildren()length) != )
{
FindCheckedFromNode(nodes[i]);
}
}
}
//添加选中节点
function AddChecked(node)
{
documentallcheckedvalue += nodegetAttribute(NodeData) + ;
}
//>
</script>这种方法有个很大的问题就是他客户端设置的CheckBox在服务器端是不能获取的现在只能在Check的时候遍历树并把Checked的值放在一个文本里然后提交到服务器然后服务器来解析@@这种字符
现在我使用的是使用的是以下的方法
function public_GetParentByTagName(element tagName)
{
var parent = elementparentNode;
var upperTagName = tagNametoUpperCase();
//如果这个元素还不是想要的tag就继续上溯
while (parent && (parenttagNametoUpperCase() != upperTagName))
{
parent = parentparentNode ? parentparentNode : parentparentElement;
}
return parent;
}
//设置节点的父节点Cheched——该节点可访问则他的父节点也必能访问
function setParentChecked(objNode)
{
var objParentDiv = public_GetParentByTagName(objNodediv);
if(objParentDiv==null || objParentDiv == undefined)
{
return;
}
var objID = objParentDivgetAttribute(ID);
objID = objIDsubstring(objIDindexOf(Nodes));
objID = objID+CheckBox;
var objParentCheckBox = documentgetElementById(objID);
if(objParentCheckBox==null || objParentCheckBox == undefined)
{
return;
}
if(objParentCheckBoxtagName!=INPUT && objParentCheckBoxtype == checkbox)
return;
objParentCheckBoxchecked = true;
setParentChecked(objParentCheckBox);
}
//设置节点的子节点uncheched——该节点不可访问则他的子节点也不能访问
function setChildUnChecked(divID)
{
var objchild = divIDchildren;
var count = objchildlength;
for(var i=;i<objchildlength;i++)
{
var tempObj = objchild[i];
if(tempObjtagName==INPUT && tempObjtype == checkbox)
{
tempObjchecked = false;
}
setChildUnChecked(tempObj);
}
}
//设置节点的子节点cheched——该节点可以访问则他的子节点也都能访问
function setChildChecked(divID)
{
var objchild = divIDchildren;
var count = objchildlength;
for(var i=;i<objchildlength;i++)
{
var tempObj = objchild[i];
if(tempObjtagName==INPUT && tempObjtype == checkbox)
{
tempObjchecked = true;
}
setChildChecked(tempObj);
}
}
//触发事件
function CheckEvent()
{
var objNode = eventsrcElement;
if(objNodetagName!=INPUT || objNodetype!=checkbox)
return;
if(objNodechecked==true)
{
setParentChecked(objNode);
var objID = objNodegetAttribute(ID);
var objID = objIDsubstring(objIDindexOf(CheckBox));
var objParentDiv = documentgetElementById(objID+Nodes);
if(objParentDiv==null || objParentDiv == undefined)
{
return;
}
setChildChecked(objParentDiv);
}
else
{
var objID = objNodegetAttribute(ID);
var objID = objIDsubstring(objIDindexOf(CheckBox));
var objParentDiv = documentgetElementById(objID+Nodes);
if(objParentDiv==null || objParentDiv == undefined)
{
return;
}
setChildUnChecked(objParentDiv);
}
}
这种方法最大的好处就是服务端能得javascript设置的Checked的值不用没点下就全部把树遍利下直接在服务端遍利一次就行了
//遍历子节点
public void GetChildNode(TreeNode Node)
{
foreach (TreeNode node in NodeChildNodes)
{
if (nodeChecked)
{
StrChecked += nodeValue+@;
}
GetChildNode(node);
}
}
我照样能得到它的Check的值