عند القيام بالأذونات، يتم تنفيذ الوظائف التالية بشكل أساسي:
1. إذا كانت العقدة قابلة للوصول، فيجب أن تكون العقدة الأصلية قابلة للوصول أيضًا؛
2. إذا كان من الممكن الوصول إلى العقدة، فيمكن أيضًا الوصول إلى العقد الفرعية الخاصة بها؛
3. إذا تعذر الوصول إلى العقدة، فلن يمكن الوصول إلى العقد الفرعية الخاصة بها أيضًا.
يمكن أن يؤدي استخدام بنية الأرقام مع CheckBox إلى الحصول على تجربة مستخدم جيدة، ولكن صعوبة البرمجة تزداد أيضًا قليلاً إذا تم كل ذلك بواسطة الخادم، فلن يعمل بالتأكيد إذا قمت بالنقر فوقه، يمكنك فقط استخدام جافا سكريبت ، وهو أمر محبط عند تصحيح الأخطاء باستخدام جافا سكريبت، فئة كلمات، وتكرار محبط كنت أستخدم الطريقة التالية.
<لغة البرمجة = "جافا سكريبت">
<!--
// تهيئة العقدة
initchecknode(document.all("tvItemClientID").value,document.all("checked").value)
// تهيئة العقدة المحددة
وظيفة initchecknode (شجرة، قيمة التلفزيون)
{
// احصل على سلسلة العقدة التي تحتاج إلى تهيئة حالة التحديد.
var SelectNodes = tvvalue;
var arrayNodes = new Array();
arrayNodes = SelectNodes.split("،");
var AllRootNode=new Array();
AllRootNode=document.getElementById(tree).getChildren();
// تهيئة العقدة المحددة
findAndCheckedNodes(AllRootNode,arrayNodes);
}
// تهيئة العقدة المحددة بناءً على سلسلة العقدة المحددة
وظيفة findAndCheckedNodes(NodeArray,nodeDatas)
{
// تنبيه (NodeArray. length)؛
إذا (parseInt(NodeArray.length)==0)
{
يعود؛
}
آخر
{
for(var i=0;i<parseInt(NodeArray.length);i++)
{
var cNode,nodeData;
cNode=NodeArray[i];
//// إذا كانت العقدة في بيانات العقدة، فقم بالتهيئة check = true;
NodeData = cNode.getAttribute("NodeData");
for(var j=0;j<nodeDatas.length;j++)
{
إذا (عقدة بيانات [ي] == عقدة بيانات)
{
cNode.setAttribute("checked"،"true")؛
استراحة؛
}
}
// إذا كانت هناك عقد فرعية، تابع العودية
إذا (parseInt(cNode.getChildren().length)!=0)
findAndCheckedNodes(cNode.getChildren(),nodeDatas);
}
}
}
//-->
// عند التحقق من الحدث
الدالة Tree_oncheck(شجرة)
{
فار ط؛
var العقدة=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 = "";
إذا (tree.getChildren().length > 0)
{
لـ (i=0;i<=tree.getChildren().length-1;i++)
{
إذا (tree.getChildren()[i].getAttribute("تم التحديد"))
{
AddChecked(tree.getChildren()[i]);
}
FindCheckedFromNode(tree.getChildren()[i]);
}
}
}
وظيفة
اختيار العقدة الفرعية
setcheck(node,Pchecked)
{
فار ط؛
var ChildNode=new Array();
ChildNode=node.getChildren();
إذا (parseInt(ChildNode.length)==0)
{
يعود؛
}
آخر
{
ل(i=0;i<ChildNode.length;i++)
{
فار cNode;
cNode=ChildNode[i];
cNode.setAttribute("Checked",Pchecked);
//cNode.Checked = Pchecked;
إذا (parseInt(cNode.getChildren().length)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
// تعيين اختيار العقدة الفرعية/إلغاء؛
// في الوقت نفسه، يجب تعيين حالة العقدة الأصلية (إذا تم إلغاء تحديدها، فسيتم تعيين هذه العقدة وجميع جهات الاتصال الخاصة بها فقط، ولن يتم تضمين جهات الاتصال الأصلية)
الدالة setParent(node,Pc)
{
varparentNode =node.getParent();
إذا (عقدة الوالدين)
{
varparentNodeFather =parentNode.getParent();
إذا (parentNodeFather)
{
setParent(parentNode,Pc);
}
إذا (كمبيوتر)
{parentNode.setAttribute("checked",Pc);}
آخر
{
checkBrother(parentNode,Pc,node.getAttribute("NodeData"))
}
}
}
// تحقق مما إذا تم تحديد جهة الاتصال الفرعية، إذا تم تحديدها، قم بإرجاع صحيح
// تحقق فقط من عقد المستوى الأول.
وظيفة checkBrother (parentNode، Pc، NodeData)
{
var ChildNodes = new Array();
ChildNodes =parentNode.getChildren();
إذا (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;
استراحة؛
}
}
إذا (بفحص)
{
parentNode.setAttribute("checked",Pc);
}
آخر
{
// حدد جميع العقد الأصلية
setParent(parentNode,!Pc)
}
}
آخر
{
parentNode.setAttribute("checked",Pc);
}
}
// احصل على حالة العقدة بأكملها
وظيفة FindCheckedFromNode(عقدة)
{
فار ط = 0؛
العقد var = new Array();
العقد = العقدة.getChildren();
لـ (i = 0; i <= العقد. الطول - 1; i++)
{
إذا (العقد[i].getAttribute("تم التحديد"))
{
AddChecked(nodes[i]);
}
إذا (parseInt(nodes[i].getChildren().length) != 0 )
{
FindCheckedFromNode(nodes[i]);
}
}
}
// أضف العقدة المحددة
وظيفة AddChecked (عقدة)
{
document.all.checked.value += العقدة.getAttribute("NodeData") + ""،"؛
}
//-->
</script>تواجه هذه الطريقة مشكلة كبيرة، وهي أنه لا يمكن الحصول على CheckBox الذي حدده العميل من جانب الخادم، ويمكنه الآن فقط اجتياز الشجرة أثناء التحقق ووضع القيمة المحددة في النص ثم إرسالها إليه الخادم، ثم سيقوم الخادم بتحليل الأحرف 1@2 @
الآن أستخدم asp.net2.0 واستخدم الطريقة التالية
الوظيفة public_GetParentByTagName(العنصر، tagName)
{
varparent = element.parentNode;
var UpperTagName = tagName.toUpperCase();
// إذا لم يكن هذا العنصر هو العلامة المطلوبة، فتابع التتبع
بينما (الوالد && (parent.tagName.toUpperCase()!= UpperTagName))
{
parent =parent.parentNode ?parent.parentNode :parent.parentElement;
}
عودة الوالدين؛
}
// قم بتعيين العقدة الأصلية للعقدة Cheched - إذا كان من الممكن الوصول إلى العقدة، فيجب أيضًا الوصول إلى العقدة الأصلية
الدالة setParentChecked(objNode)
{
var objParentDiv = public_GetParentByTagName(objNode,"div");
إذا (objParentDiv==null || objParentDiv == "غير محدد")
{
يعود؛
}
var objID = objParentDiv.getAttribute("ID");
objID = objID.substring(0,objID.indexOf("العقد"));
objID = objID+"CheckBox";
var objParentCheckBox = document.getElementById(objID);
إذا (objParentCheckBox==null || objParentCheckBox == "غير محدد")
{
يعود؛
}
إذا (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];
إذا (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];
إذا (tempObj.tagName = "INPUT" && tempObj.type == "مربع الاختيار")
{
tempObj.checked = true;
}
setChildChecked(tempObj);
}
}
// حدث التشغيل
الدالة CheckEvent()
{
var objNode = events.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");
إذا (objParentDiv==null || objParentDiv == "غير محدد")
{
يعود؛
}
setChildChecked(objParentDiv);
}
آخر
{
var objID = objNode.getAttribute("ID");
var objID = objID.substring(0,objID.indexOf("CheckBox"));
var objParentDiv = document.getElementById(objID+"Nodes");
إذا (objParentDiv==null || objParentDiv == "غير محدد")
{
يعود؛
}
setChildUnChecked(objParentDiv);
}
}الميزة الأكبر لهذه الطريقة هي أن الخادم يمكنه الحصول على القيمة التي تم التحقق منها بواسطة جافا سكريبت، وليست هناك حاجة لتنزيل جميع الأشجار دون النقر عليها، يمكنك فقط تنزيلها مرة واحدة على الخادم.
// اجتياز العقد الفرعية
الفراغ العام GetChildNode (عقدة TreeNode)
{
foreach (عقدة TreeNode في Node.ChildNodes)
{
إذا (عقدة. تم التحقق)
{
StrChecked += العقدة.Value+"@";
}
GetChildNode(node);
}
}
}لا يزال بإمكاني الحصول على قيمة الشيك الخاصة به