0

我正在使用 TreeView 控件。使用复选框绑定数据库中的值。

父节点有近三个子节点,例如

Parent1 
  child1
    child2
      child3
Parent2
   child1
     child2
        child3

我可以绑定来自 3 个表的数据,它们都运行良好。我想要一个设施,当父节点检查其所有相应的子节点时会自动检查。如果我单击父节点 1,则子节点 123 会被检查。如果我检查 child1,child2 和 child3 会被检查。如果我检查孩子 2,所有孩子 3 项目都会被检查。怎么做?

在此先感谢 Amrutha

4

2 回答 2

2

如果选中了父节点,则可以使用下面的 javascript 函数检查所有子节点,如果选中了至少一个子节点,则检查父节点,否则未选中:

 function OnTreeClick(evt) {
     var src = window.event != window.undefined ? window.event.srcElement : evt.target;
     var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox");
     var t = GetParentByTagName("table", src);
     if (isChkBoxClick) {
         var parentTable = GetParentByTagName("table", src);
         var nxtSibling = parentTable.nextSibling;
         if (nxtSibling && nxtSibling.nodeType == 1) {
             if (nxtSibling.tagName.toLowerCase() == "div") {
                 CheckUncheckChildren(parentTable.nextSibling, src.checked);
             }
         }
         CheckUncheckParents(src, src.checked);
     }
 }

 function CheckUncheckChildren(childContainer, check) {
     var childChkBoxes = childContainer.getElementsByTagName("input");
     var childChkBoxCount = childChkBoxes.length;
     for (var i = 0; i < childChkBoxCount; i++) {
         childChkBoxes[i].checked = check;
     }
 }

 function CheckUncheckParents(srcChild, check) {
     var parentDiv = GetParentByTagName("div", srcChild);
     var parentNodeTable = parentDiv.previousSibling;

     if (parentNodeTable) {
         var checkUncheckSwitch;
         var isAllSiblingsChecked = AreAllSiblingsChecked(srcChild);
         if (isAllSiblingsChecked) {
             checkUncheckSwitch = true;
         }
         else {
             checkUncheckSwitch = false;
         }
         var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input");
         if (inpElemsInParentTable.length > 0) {
             var parentNodeChkBox = inpElemsInParentTable[0];
             parentNodeChkBox.checked = checkUncheckSwitch;

             CheckUncheckParents(parentNodeChkBox, checkUncheckSwitch);
         }
     }
 }

 function AreAllSiblingsChecked(chkBox) {
     var parentDiv = GetParentByTagName("div", chkBox);
     var childCount = parentDiv.childNodes.length;
     var k = 0;
     for (var i = 0; i < childCount; i++) {
         if (parentDiv.childNodes[i].nodeType == 1) {
             if (parentDiv.childNodes[i].tagName.toLowerCase() == "table") {
                 var prevChkBox = parentDiv.childNodes[i].getElementsByTagName("input")[0];
                 //if any of sibling nodes are not checked, return false
                 if (prevChkBox.checked) {
                     //add each selected node one value
                     k = k + 1;
                 }
             }
         }
     }

     //Finally check any one of child node is select if selected yes then return ture parent node check

     if (k > 0) {
         return true;
     }
     else {
         return false;
     }
 }
 function GetParentByTagName(parentTagName, childElementObj) {
     var parent = childElementObj.parentNode;
     while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {
         parent = parent.parentNode;
     }
     return parent;
 }

我用这个javascript来解决我的问题。

于 2012-08-03T04:50:20.787 回答
0

一个简单的递归函数可以做到这一点。

private bool checkTreeNodes(TreeNodeCollection nodes, bool parentChecked)
{
    var isChecked = parentChecked;
    foreach (TreeNode node in nodes)
    {
        if (node.Checked || parentChecked)
        {
            checkTreeNodes(node.Nodes, true);
            node.Checked = true;
            isChecked = true;
        }
        else
        {
            node.Checked = checkTreeNodes(node.Nodes, false);
            isChecked = isChecked || node.Checked;
        }
    }
    return isChecked;
}

像这样使用它:

checkTreeNodes(myTree.Nodes, false);
于 2012-07-23T06:05:41.433 回答