【问题标题】:asp.net treeview checkbox selectionasp.net treeview 复选框选择
【发布时间】:2010-11-29 02:04:15
【问题描述】:

我有几个父节点。每个父节点都包含一个子节点列表。我的 showcheckboxes 设置为全部。

我的问题:

在客户端,当我检查父节点时 - 如何在不回发或使用 ajax 的情况下检查所有子节点。

问候

【问题讨论】:

    标签: c# javascript asp.net checkbox treeview


    【解决方案1】:
    private void CheckUnCheck(object sender)
            {
                if ((sender as TreeView).SelectedNode.Checked == true)
                    foreach (TreeNode tr in (sender as TreeView).SelectedNode.ChildNodes)
                    {
                        foreach (TreeNode child in tr.ChildNodes)
                            child.Checked = true;
                        tr.Checked = true;
                    }
                else
                    foreach (TreeNode tr in (sender as TreeView).SelectedNode.ChildNodes)
                    {
                        foreach (TreeNode child in tr.ChildNodes)
                            child.Checked = false;
                        tr.Checked = false;
                    }
            }
    

    【讨论】:

      【解决方案2】:

      上面的解决方案很好,非常感谢。 我将 Method CheckUncheckParents() 更改为我的偏好:选中其中一个子节点时,也会检查父节点。

      function OnTreeClick(evt) {
          var src = window.event != window.undefined ? window.event.srcElement : evt.target
          var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox");
          if (isChkBoxClick) {
              var parentTable = GetParentByTagName("table", src);
              var nxtSibling = parentTable.nextSibling;
              if (nxtSibling && nxtSibling.nodeType == 1)//check if nxt sibling is not null & is an element node
              {
                  if (nxtSibling.tagName.toLowerCase() == "div") //if node has children
                  {
                      //check or uncheck children at all levels
                      CheckUncheckChildren(parentTable.nextSibling, src.checked);
                  }
              }
              //check or uncheck parents at all levels
              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;
      
              if (check) //checkbox checked
              {
                  checkUncheckSwitch = true;
              }
              else //checkbox unchecked
              {
                  var isAllSiblingsUnChecked = AreAllSiblingsUnChecked(srcChild);
                  if (!isAllSiblingsUnChecked)
                      checkUncheckSwitch = true;
                  else
                      checkUncheckSwitch = false;
              }
      
              var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input");
              if (inpElemsInParentTable.length > 0) {
                  var parentNodeChkBox = inpElemsInParentTable[0];
                  parentNodeChkBox.checked = checkUncheckSwitch;
                  //do the same recursively
                  CheckUncheckParents(parentNodeChkBox, checkUncheckSwitch);
              }
          }
      }
      
      function AreAllSiblingsUnChecked(chkBox) {
          var parentDiv = GetParentByTagName("div", chkBox);
          var childCount = parentDiv.childNodes.length;
          for (var i = 0; i < childCount; i++) {
              if (parentDiv.childNodes[i].nodeType == 1) //check if the child node is an element node
              {
                  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) {
                          return false;
                      }
                  }
              }
          }
          return true;
      }
      
      //utility function to get the container of an element by tagname
      function GetParentByTagName(parentTagName, childElementObj) {
          var parent = childElementObj.parentNode;
          while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {
              parent = parent.parentNode;
          }
          return parent;
      }
      

      【讨论】:

      • 谢谢,这是一个老话题,但对我帮助很大!
      • 在 Firefox 中不适合我。我已经传递了与您提供的代码相同的代码
      • 此代码适用于除我之外的所有人。可能是什么问题。我在 modelpopupextender 控件中显示树视图。是不是错了
      【解决方案3】:

      由于我遇到了与问题完全相同的问题,因此我不得不更改解决方案以仅影响子节点。

      <script language="javascript" type="text/javascript">
      function OnTreeClick(evt) {
          var src = window.event != window.undefined ? window.event.srcElement : evt.target;
          var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox");
          if (isChkBoxClick) {
              var parentTable = GetParentByTagName("table", src);
              var nxtSibling = parentTable.nextSibling;
              if (nxtSibling && nxtSibling.nodeType == 1)//check if nxt sibling is not null & is an element node
              {
                  if (nxtSibling.tagName.toLowerCase() == "div") //if node has children
                  {
                      //check or uncheck children at all levels
                      CheckUncheckChildren(parentTable.nextSibling, src.checked);
                  }
              }
              //check or uncheck parents at all levels
              //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;
          }
      }
      
      
      //utility function to get the container of an element by tagname
      function GetParentByTagName(parentTagName, childElementObj) {
          var parent = childElementObj.parentNode;
          while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {
              parent = parent.parentNode;
          }
          return parent;
      }
      

      【讨论】:

        【解决方案4】:
        tv.Attributes.Add("onclick", "OnTreeClick(event)");
        

        添加此 javascript 代码

        <script language="javascript" type="text/javascript">
            function OnTreeClick(evt) {
                var src = window.event != window.undefined ? window.event.srcElement : evt.target;
                var isChkBoxClick = (src.tagName.toLowerCase() == "input" && src.type == "checkbox");
                if (isChkBoxClick) {
                    var parentTable = GetParentByTagName("table", src);
                    var nxtSibling = parentTable.nextSibling;
                    if (nxtSibling && nxtSibling.nodeType == 1)//check if nxt sibling is not null & is an element node
                    {
                        if (nxtSibling.tagName.toLowerCase() == "div") //if node has children
                        {
                            //check or uncheck children at all levels
                            CheckUncheckChildren(parentTable.nextSibling, src.checked);
                        }
                    }
                    //check or uncheck parents at all levels
                    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;
        
                    if (check) //checkbox checked
                    {
                        var isAllSiblingsChecked = AreAllSiblingsChecked(srcChild);
                        if (isAllSiblingsChecked)
                            checkUncheckSwitch = true;
                        else
                            return; //do not need to check parent if any(one or more) child not checked
                    }
                    else //checkbox unchecked
                    {
                        checkUncheckSwitch = false;
                    }
        
                    var inpElemsInParentTable = parentNodeTable.getElementsByTagName("input");
                    if (inpElemsInParentTable.length > 0) {
                        var parentNodeChkBox = inpElemsInParentTable[0];
                        parentNodeChkBox.checked = checkUncheckSwitch;
                        //do the same recursively
                        CheckUncheckParents(parentNodeChkBox, checkUncheckSwitch);
                    }
                }
            }
        
            function AreAllSiblingsChecked(chkBox) {
                var parentDiv = GetParentByTagName("div", chkBox);
                var childCount = parentDiv.childNodes.length;
                for (var i = 0; i < childCount; i++) {
                    if (parentDiv.childNodes[i].nodeType == 1) //check if the child node is an element node
                    {
                        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) {
                                return false;
                            }
                        }
                    }
                }
                return true;
            }
        
            //utility function to get the container of an element by tagname
            function GetParentByTagName(parentTagName, childElementObj) {
                var parent = childElementObj.parentNode;
                while (parent.tagName.toLowerCase() != parentTagName.toLowerCase()) {
                    parent = parent.parentNode;
                }
                return parent;
            }
        
        </script>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-05
          相关资源
          最近更新 更多