2012-07-23 95 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來解決我的問題。