Bei der Berechtigung werden hauptsächlich folgende Funktionen implementiert:
1. Wenn der Knoten zugänglich ist, muss auch sein übergeordneter Knoten zugänglich sein;
2. Wenn auf den Knoten zugegriffen werden kann, kann auch auf seine untergeordneten Knoten zugegriffen werden.
3. Wenn auf den Knoten nicht zugegriffen werden kann, sind auch seine untergeordneten Knoten nicht zugreifbar.
Die Verwendung einer Zahlenstruktur mit CheckBox kann zu einer guten Benutzererfahrung führen, aber die Programmierung ist auch etwas schwieriger. Wenn alles vom Server erledigt wird, funktioniert es definitiv nicht, wenn Sie darauf klicken , was beim Debuggen mit Javascript sehr frustrierend ist, und eine frustrierende Rekursion. Ich habe die folgende Methode verwendet.
<script language="javascript">
<!--
//Knoten initialisieren
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
//Ausgewählten Knoten initialisieren
Funktion initchecknode(tree,tvvalue)
{
//Erhalten Sie die Zeichenfolge des Knotens, der den Auswahlstatus initialisieren muss.
var selectedNodes = tvvalue;
var arrayNodes = new Array();
arrayNodes = selectedNodes.split(",");
var AllRootNode=new Array();
AllRootNode=document.getElementById(tree).getChildren();
//Initialisiere den ausgewählten Knoten
findAndCheckedNodes(AllRootNode,arrayNodes);
}
// Initialisiere den ausgewählten Knoten basierend auf der Zeichenfolge des ausgewählten Knotens
Funktion findAndCheckedNodes(NodeArray,nodeDatas)
{
//alert(NodeArray.length);
if(parseInt(NodeArray.length)==0)
{
zurückkehren;
}
anders
{
for(var i=0;i<parseInt(NodeArray.length);i++)
{
var cNode,nodeData;
cNode=NodeArray[i];
////Wenn sich der Knoten in nodeDatas befindet, initialize reviewed = true;
nodeData = cNode.getAttribute("NodeData");
for(var j=0;j<nodeDatas.length;j++)
{
if(nodeDatas[j] == nodeData)
{
cNode.setAttribute("checked","true");
brechen;
}
}
//Wenn es untergeordnete Knoten gibt, fahren Sie mit der Rekursion fort
if(parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
//oncheck-Ereignis
Funktion 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]);
}
}
}
//Setze die Auswahlfunktion für untergeordnete Knoten
setcheck(node,Pchecked)
{
var i;
var ChildNode=new Array();
ChildNode=node.getChildren();
if(parseInt(ChildNode.length)==0)
{
zurückkehren;
}
anders
{
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);
}
}
}
}
//Auswahl des untergeordneten Knotens festlegen/abbrechen;
//Gleichzeitig muss der Status des übergeordneten Knotens festgelegt werden (wenn er deaktiviert ist, werden nur dieser Knoten und alle seine Kontakte festgelegt, die übergeordneten Kontakte sind nicht beteiligt)
Funktion setParent(Knoten,PC)
{
var parentNode = node.getParent();
if(parentNode)
{
var parentNodeFather = parentNode.getParent();
if(parentNodeFather)
{
setParent(parentNode,Pc);
}
wenn(Pc)
{parentNode.setAttribute("checked",Pc);}
anders
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
//Überprüfen Sie, ob der Unterkontakt ausgewählt ist. Wenn einer ausgewählt ist, geben Sie true zurück
//Überprüfe nur die Knoten der ersten Ebene.
Funktion 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("Text"));
bChecked = false;
brechen;
}
}
if(bChecked)
{
parentNode.setAttribute("checked",Pc);
}
anders
{
//Alle übergeordneten Knoten auswählen
setParent(parentNode,!Pc)
}
}
anders
{
parentNode.setAttribute("checked",Pc);
}
}
//Alle Knotenstatus abrufen
Funktion FindCheckedFromNode(node)
{
var i = 0;
var nodes = new Array();
nodes = node.getChildren();
for (i = 0; i <= nodes.length - 1; i++)
{
if (nodes[i].getAttribute("Checked"))
{
AddChecked(nodes[i]);
}
if (parseInt(nodes[i].getChildren().length) != 0 )
{
FindCheckedFromNode(nodes[i]);
}
}
}
//Ausgewählten Knoten hinzufügen
Funktion AddChecked(Knoten)
{
document.all.checked.value += node.getAttribute("NodeData") + ",";
}
//-->
</script>Diese Methode hat ein großes Problem, das heißt, dass die vom Client festgelegte CheckBox nicht auf der Serverseite abgerufen werden kann. Jetzt kann sie den Baum nur während der Prüfung durchlaufen und den geprüften Wert in einen Text einfügen Der Server analysiert dann die Zeichen 1@2 @
Jetzt verwende ich asp.net2.0 und verwende die folgende Methode
Funktion public_GetParentByTagName(element, tagName)
{
var parent = element.parentNode;
var UpperTagName = tagName.toUpperCase();
//Wenn dieses Element nicht das gewünschte Tag ist, fahren Sie mit der Verfolgung fort
while (parent && (parent.tagName.toUpperCase() !=upperTagName))
{
parent = parent.parentNode ? parent.parentNode : parent.parentElement;
}
Elternteil zurückgeben;
}
//Legen Sie den übergeordneten Knoten des Knotens fest. Cheched – Wenn auf den Knoten zugegriffen werden kann, muss auch auf seinen übergeordneten Knoten zugegriffen werden
Funktion setParentChecked(objNode)
{
var objParentDiv = public_GetParentByTagName(objNode,"div");
if(objParentDiv==null || objParentDiv == "undefiniert")
{
zurückkehren;
}
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("Nodes"));
objID = objID+"CheckBox";
var objParentCheckBox = document.getElementById(objID);
if(objParentCheckBox==null || objParentCheckBox == "undefiniert")
{
zurückkehren;
}
if(objParentCheckBox.tagName!="INPUT" && objParentCheckBox.type == "checkbox")
zurückkehren;
objParentCheckBox.checked = true;
setParentChecked(objParentCheckBox);
}
// Setzen Sie den untergeordneten Knoten des Knotens auf deaktiviert – wenn auf den Knoten nicht zugegriffen werden kann, sind auch seine untergeordneten Knoten nicht zugänglich.
Funktion setChildUnChecked(divID)
{
var objchild = divID.children;
var count = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
{
tempObj.checked = false;
}
setChildUnChecked(tempObj);
}
}
//Legen Sie den untergeordneten Knoten des Knotens fest – wenn auf den Knoten zugegriffen werden kann, kann auch auf seine untergeordneten Knoten zugegriffen werden
Funktion setChildChecked(divID)
{
var objchild = divID.children;
var count = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "checkbox")
{
tempObj.checked = true;
}
setChildChecked(tempObj);
}
}
//Ereignis auslösen
Funktion 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 == "undefiniert")
{
zurückkehren;
}
setChildChecked(objParentDiv);
}
anders
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Nodes");
if(objParentDiv==null || objParentDiv == "undefiniert")
{
zurückkehren;
}
setChildUnChecked(objParentDiv);
}
}Der größte Vorteil dieser Methode besteht darin, dass der Server den von Javascript festgelegten Wert abrufen kann. Es ist nicht erforderlich, alle Bäume herunterzuladen, ohne sie anzuklicken.
//Untergeordnete Knoten durchqueren
public void GetChildNode(TreeNode Node)
{
foreach (TreeNode-Knoten in Node.ChildNodes)
{
if (node.Checked)
{
StrChecked += node.Value+"@";
}
GetChildNode(node);
}
}
}Ich kann immer noch den Prüfwert abrufen