2012-07-23 82 views
0

我正在使用TreeView控件。使用复选框绑定数据库中的值。父节点检查时自动检查树视图控件中的子节点

近三个孩子都没有像

Parent1 
    child1 
    child2 
     child3 
Parent2 
    child1 
    child2 
     child3 

我能结合这是从3个表都运作良好数据的父节点。我想要一个设施,当一个父节点检查所有相应的孩子自动得到检查。如果我点击父母1,孩子123得到检查。如果我检查child1,child2和child3被检查。如果我检查孩子2,所有孩子3件物品都会被检查。怎么做?

由于提前 Amrutha

回答

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); 
+0

嗨,感谢您的回复.i尝试了您的代码,但发生错误,如错误'admin_Add_Role.checkTreeNodes(System.Web.UI.WebControls.TreeNodeCollection,bool)'的最佳重载方法匹配有一些无效参数\t错误参数1:无法从'方法组'转换为'System.Web.UI.WebControls.TreeNodeCollection' – Amritha 2012-07-25 04:59:07

+0

checkTreeNodes,如您在函数中所看到的那样,将TreeNodeCollection作为参数。你的错误表明你将它传递给你的树的TreeNodeCollection。 – nunespascal 2012-07-25 05:05:00

1

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来解决我的问题。

相关问题