asp.net treeview复选框选择

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

我的问题 :

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

问候

tv.Attributes.Add("onclick", "OnTreeClick(event)"); 

添加此javascript代码

  

上面有很好的解决方案,非常感谢。 我将Method CheckUncheckParents()更改为我的首选项:当选中其中一个childnode时,也会检查parentnode。

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

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

  

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