【问题标题】:child nodes in treeview control automatically checked when parent node checked树视图控件中的子节点在检查父节点时自动检查
【发布时间】:2012-07-23 04:44:47
【问题描述】:

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

父节点有近三个子节点

Parent1 
  child1
    child2
      child3
Parent2
   child1
     child2
        child3

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

提前致谢 阿姆鲁塔

【问题讨论】:

    标签: asp.net


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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您好,感谢您的回复。我尝试了您的代码,但发生了诸如错误 30 之类的错误 'admin_Add_Role.checkTreeNodes(System.Web.UI.WebControls.TreeNodeCollection, bool)' 的最佳重载方法匹配有一些无效参数错误 31 参数 1:无法从“方法组”转换为“System.Web.UI.WebControls.TreeNodeCollection”
      • checkTreeNodes 如您在函数中所见,将 TreeNodeCollection 作为参数。您的错误表明您正在将树的 TreeNodeCollection 传递给它。
      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多