権限を設定する場合、主に次の機能が実装されます。
1. ノードがアクセス可能な場合は、その親ノードもアクセス可能である必要があります。
2. ノードがアクセス可能な場合は、その子ノードにもアクセスできます。
3. ノードにアクセスできない場合、その子ノードにもアクセスできません。
CheckBox で数値構造を使用すると、優れたユーザー エクスペリエンスが得られますが、プログラミングの難易度も少し高くなります。すべてがサーバーによって行われる場合は、JavaScript のみを使用する必要があります。 、JavaScript でデバッグするときにイライラします。非常に、ワード クラスで、イライラする再帰を使用していました。
<スクリプト言語="javascript">
<!--
//ノードを初期化する
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
//選択したノードを初期化します
関数 initchecknode(tree,tvvalue)
{
//選択状態を初期化する必要があるノードの文字列を取得します。
var selectedNodes = tvvalue;
var arrayNodes = 新しい Array();
arrayNodes = selectedNodes.split(",");
var AllRootNode=新しい Array();
AllRootNode=document.getElementById(tree).getChildren();
//選択したノードを初期化します
findAndCheckedNodes(AllRootNode,arrayNodes);
}
//選択したノードの文字列に基づいて選択したノードを初期化します
関数 findAndCheckedNodes(NodeArray,nodeDatas)
{
//alert(NodeArray.length);
if(parseInt(NodeArray.length)==0)
{
戻る;
}
それ以外
{
for(var i=0;i<parseInt(NodeArray.length);i++)
{
var cNode,nodeData;
cNode=ノード配列[i];
////ノードがnodeDatasにある場合、checked = trueを初期化します。
ノードデータ = cNode.getAttribute("ノードデータ");
for(var j=0;j<nodeDatas.length;j++)
{
if(ノードデータ[j] == ノードデータ)
{
cNode.setAttribute("チェック済み","true");
壊す;
}
}
//子ノードがある場合は再帰を続行
if(parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
//オンチェックイベント
関数tree_oncheck(tree)
{
変数 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]);
}
}
}
//子ノード選択
関数を設定 setcheck(node,Pchecked)
{
変数 i;
var ChildNode=新しいArray();
ChildNode=node.getChildren();
if(parseInt(ChildNode.length)==0)
{
戻る;
}
それ以外
{
for(i=0;i<ChildNode.length;i++)
{
var cNode;
cNode=子ノード[i];
cNode.setAttribute("チェック済み",Pchecked);
//cNode.Checked = Pchecked;
if(parseInt(cNode.getChildren().length)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
//子ノードの選択/解除を設定します。
//同時に、親ノードのステータスを設定する必要があります (選択を解除すると、このノードとそのすべての連絡先のみが設定され、親の連絡先は関係しません)
関数 setParent(node,Pc)
{
varparentNode = node.getParent();
if(親ノード)
{
varparentNodeFather =parentNode.getParent();
if(親ノードの父)
{
setParent(親ノード,PC);
}
もし(パソコン)
{parentNode.setAttribute("checked",Pc);}
それ以外
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
// サブ連絡先が選択されているかどうかを確認し、選択されている場合は true を返します
//第 1 レベルのノードのみをチェックします。
関数 checkBrother(parentNode,Pc,NodeData)
{
var childNodes = 新しい 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;
壊す;
}
}
if(チェック済み)
{
parentNode.setAttribute("チェック済み",Pc);
}
それ以外
{
//すべての親ノードを選択します
setParent(parentNode,!Pc)
}
}
それ以外
{
parentNode.setAttribute("チェック済み",Pc);
}
}
//すべてのノードのステータスを取得します
関数 FindCheckedFromNode(ノード)
{
変数 i = 0;
var ノード = 新しい Array();
ノード = ノード.getChildren();
for (i = 0; i <= ノード.長さ - 1; i++)
{
if (nodes[i].getAttribute("Checked"))
{
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 親 = element.parentNode;
var upperTagName = tagName.toUpperCase();
//この要素が目的のタグではない場合は、トレースアップを続行します
while (親 && (parent.tagName.toUpperCase() != upperTagName))
{
親 = 親.親ノード ? 親.親ノード : 親.親要素;
}
親を返します。
}
// ノードの親ノードをチェック済みに設定します - ノードがアクセス可能な場合は、その親ノードもアクセス可能である必要があります
関数 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 count = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempObj = objchild[i];
if(tempObj.tagName=="INPUT" && tempObj.type == "チェックボックス")
{
tempObj.checked = false;
}
setChildUnChecked(tempObj);
}
}
// ノードの子ノードをチェックに設定します - ノードにアクセスできる場合は、その子ノードにもアクセスできます
関数 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 == "チェックボックス")
{
tempObj.checked = true;
}
setChildChecked(tempObj);
}
}
//イベントをトリガーする
関数 CheckEvent()
{
var objNode =event.srcElement;
if(objNode.tagName!="INPUT" || objNode.type!="チェックボックス")
戻り値;
if(objNode.checked==true)
{
setParentChecked(objNode);
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"ノード");
if(objParentDiv==null || objParentDiv == "未定義")
{
戻る;
}
setChildChecked(objParentDiv);
}
それ以外
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"ノード");
if(objParentDiv==null || objParentDiv == "未定義")
{
戻る;
}
setChildUnChecked(objParentDiv);
}
この方法の最大の利点は、サーバーが JavaScript によって設定された Checked 値を取得できることです。クリックせずにすべてのツリーをダウンロードする必要はなく、サーバー上で一度ダウンロードするだけで済みます。
//子ノードを走査する
public void GetChildNode(ツリーノードノード)
{
foreach (Node.ChildNodes の TreeNode ノード)
{
if (ノード.チェック済み)
{
StrChecked += ノード.値+"@";
}
GetChildNode(ノード);
}
}
}チェック値はまだ取得できます