資料來源:https://forums.asp.net/t/1367074.aspx
<%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { TreeViewDemo.Attributes.Add("onclick", "OnTreeClick(event)"); } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Page</title> <script language="javascript" type="text/javascript"> //************************** Treeview Parent-Child check behaviour ****************************// 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 child is 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> <body> <form id="form1" runat="server"> <div> <asp:TreeView ID="TreeViewDemo" runat="server" ExpandDepth="0" ShowCheckBoxes="All"> <Nodes> <asp:TreeNode NavigateUrl="http://www.asp.net" Text="A" Value="A"> <asp:TreeNode NavigateUrl="" Text="A1" Value="A1"> <asp:TreeNode NavigateUrl="http://www.asp.net" Text="A11" Value="A11"></asp:TreeNode> <asp:TreeNode NavigateUrl="http://www.asp.net" Text="A12" Value="A12"></asp:TreeNode> </asp:TreeNode> <asp:TreeNode NavigateUrl="http://www.asp.net" Text="A2" Value="A2"> <asp:TreeNode NavigateUrl="http://www.asp.net" Text="A21" Value="A21"></asp:TreeNode> <asp:TreeNode NavigateUrl="http://www.asp.net" Text="A22" Value="A22"></asp:TreeNode> </asp:TreeNode> </asp:TreeNode> </Nodes> </asp:TreeView> </div> </form> </body> </html>

沒有留言:
張貼留言