권한을 수행할 때 주로 다음 기능이 구현됩니다.
1. 노드에 액세스할 수 있으면 해당 상위 노드도 액세스할 수 있어야 합니다.
2. 노드에 액세스할 수 있으면 해당 하위 노드에도 액세스할 수 있습니다.
3. 노드에 액세스할 수 없으면 해당 하위 노드에도 액세스할 수 없습니다.
CheckBox와 함께 숫자 구조를 사용하면 좋은 사용자 경험을 얻을 수 있지만 프로그래밍의 난이도도 약간 증가합니다. 서버에서 모두 수행하면 javascript만 사용할 수 있습니다. , 이는 javascript로 디버깅할 때 답답합니다. 매우, 단어 클래스이고, 다음과 같은 방법을 사용하곤 했습니다.
<스크립트 언어="자바스크립트">
<!--
//노드 초기화
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
//선택한 노드 초기화
함수 initchecknode(tree,tvvalue)
{
//선택 상태를 초기화해야 하는 노드의 문자열을 가져옵니다.
var selectedNodes = tvvalue;
var arrayNodes = 새로운 배열();
arrayNodes = selectedNodes.split(",");
var AllRootNode=새 배열();
AllRootNode=document.getElementById(tree).getChildren();
//선택한 노드를 초기화합니다.
findAndCheckedNodes(AllRootNode,arrayNodes);
}
//선택한 노드의 문자열을 기반으로 선택한 노드를 초기화합니다.
함수 findAndCheckedNodes(NodeArray,nodeDatas)
{
//경고(NodeArray.length);
if(parseInt(NodeArray.length)==0)
{
반품;
}
또 다른
{
for(var i=0;i<parseInt(NodeArray.length);i++)
{
var cNode,nodeData;
cNode=노드배열[i];
////노드가 nodeDatas에 있으면 초기화 selected = true;
nodeData = cNode.getAttribute("NodeData");
for(var j=0;j<nodeDatas.length;j++)
{
if(nodeDatas[j] == nodeData)
{
cNode.setAttribute("checked","true");
부서지다;
}
}
//자식 노드가 있으면 재귀를 계속합니다.
if(parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
//체크 이벤트
함수 tree_oncheck(트리)
{
var i;
var node=tree.getTreeNode(tree.clickedNodeIndex);
var Pchecked=tree.getTreeNode(tree.clickedNodeIndex).getAttribute("checked");
setcheck(노드,Pchecked);
setParent(노드,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("체크됨"))
{
AddChecked(tree.getChildren()[i]);
}
FindCheckedFromNode(tree.getChildren()[i]);
}
}
}
//자식 노드 선택
함수 설정 setcheck(node,Pchecked)
{
var i;
var ChildNode=새 배열();
ChildNode=node.getChildren();
if(parseInt(ChildNode.length)==0)
{
반품;
}
또 다른
{
for(i=0;i<ChildNode.length;i++)
{
var cNode;
cNode=하위 노드[i];
cNode.setAttribute("Checked",Pchecked);
//cNode.Checked = P체크됨;
if(parseInt(cNode.getChildren().length)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
//자식 노드 선택 설정/취소;
//동시에 상위 노드의 상태를 설정해야 합니다. (선택을 취소하면 이 노드와 모든 연락처만 설정되고 상위 연락처는 관련되지 않습니다.)
함수 setParent(노드,PC)
{
var parentNode = node.getParent();
if(부모노드)
{
var parentNodeFather = parentNode.getParent();
if(부모노드아버지)
{
setParent(parentNode,Pc);
}
만약(PC)
{parentNode.setAttribute("checked",Pc);}
또 다른
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//하위 연락처가 선택되었는지 확인하고, 선택된 경우 true를 반환합니다.
//첫 번째 레벨 노드만 확인합니다.
함수 checkBrother(parentNode,Pc,NodeData)
{
var childNodes = new Array();
childNodes = parentNode.getChildren();
if(childNodes.length >0)
{
var bChecked = true;
for(var i=0;i<childNodes.length;i++)
{
if(childNodes[i].getAttribute("checked") == true && childNodes[i].getAttribute("NodeData") != NodeData)
{
//alert(i+childNodes[i].getAttribute("텍스트"));
b체크됨 = false;
부서지다;
}
}
if(b체크됨)
{
parentNode.setAttribute("checked",Pc);
}
또 다른
{
//모든 상위 노드 선택
setParent(parentNode,!Pc)
}
}
또 다른
{
parentNode.setAttribute("checked",Pc);
}
}
//모든 노드 상태를 가져옵니다.
함수 FindCheckedFromNode(노드)
{
var 나는 = 0;
var 노드 = 새로운 배열();
노드 = node.getChildren();
for (i = 0; i <= node.length - 1; i++)
{
if (nodes[i].getAttribute("체크됨"))
{
AddChecked(노드[i]);
}
if (parseInt(nodes[i].getChildren().length) != 0 )
{
FindCheckedFromNode(노드[i]);
}
}
}
//선택한 노드 추가
함수 AddChecked(노드)
{
document.all.checked.value += node.getAttribute("NodeData") + ",";
}
//-->
</script>이 방법은 클라이언트가 설정한 CheckBox를 서버 측에서 얻을 수 없다는 큰 문제가 있습니다. 이제는 Check 동안 트리를 순회하고 Checked 값을 텍스트에 입력할 수만 있습니다. 그러면 서버는 1@2 @ 문자를 구문 분석합니다.
이제 asp.net2.0을 사용하고 있으며 다음 방법을 사용합니다.
함수 public_GetParentByTagName(요소, 태그이름)
{
var parent = element.parentNode;
var upperTagName = tagName.toUpperCase();
//이 요소가 원하는 태그가 아닌 경우 계속 추적합니다.
while (부모 && (parent.tagName.toUpperCase() != upperTagName))
{
부모 = parent.parentNode ? parent.parentNode : parent.parentElement;
}
부모를 돌려보내다;
}
//노드의 상위 노드 설정 Cheched - 노드에 액세스할 수 있으면 해당 상위 노드에도 액세스할 수 있어야 합니다.
함수 setParentChecked(objNode)
{
var objParentDiv = public_GetParentByTagName(objNode,"div");
if(objParentDiv==null || objParentDiv == "정의되지 않음")
{
반품;
}
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("노드"));
objID = objID+"체크박스";
var objParentCheckBox = document.getElementById(objID);
if(objParentCheckBox==null || objParentCheckBox == "정의되지 않음")
{
반품;
}
if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "체크박스")
반품;
objParentCheckBox.checked = true;
setParentChecked(objParentCheckBox);
}
//노드의 하위 노드를 선택 취소로 설정합니다. 노드에 액세스할 수 없으면 해당 하위 노드에도 액세스할 수 없습니다.
함수 setChildUnChecked(divID)
{
var objchild = divID.children;
var 개수 = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="입력" && tempObj.type == "체크박스")
{
tempObj.checked = 거짓;
}
setChildUnChecked(tempObj);
}
}
//노드의 하위 노드를 cheched로 설정 - 노드에 액세스할 수 있으면 해당 하위 노드에도 액세스할 수 있습니다.
함수 setChildChecked(divID)
{
var objchild = divID.children;
var 개수 = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="입력" && tempObj.type == "체크박스")
{
tempObj.checked = true;
}
setChildChecked(tempObj);
}
}
//트리거 이벤트
함수 CheckEvent()
{
var objNode = event.srcElement;
if(objNode.tagName!="INPUT" || objNode.type!="checkbox")
반환;
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 == "정의되지 않음")
{
반품;
}
setChildChecked(objParentDiv);
}
또 다른
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Nodes");
if(objParentDiv==null || objParentDiv == "정의되지 않음")
{
반품;
}
setChildUnChecked(objParentDiv);
}
} 이 방법의 가장 큰 장점은 서버가 자바스크립트로 설정한 Checked 값을 얻을 수 있다는 것입니다. 모든 트리를 클릭하지 않고 서버에서 한 번만 다운로드하면 됩니다.
//자식 노드 트래버스
공공 무효 GetChildNode(TreeNode 노드)
{
foreach(Node.ChildNodes의 TreeNode 노드)
{
if (노드.체크됨)
{
StrChecked += node.Value+"@";
}
GetChildNode(노드);
}
}
}아직 수표 값을 얻을 수 있습니다