问题描述
我把没用的代码都去掉,核心代码就是下面的,点击树上的某个控件之后,用递归把其下面的所有叶节点全部取出来,但是出了错,在线等待高人解答错在哪里,或者直接告诉我应该怎么取//点击树上的某个节点protectedvoidtvCate_SelectedNodeChanged(objectsender,EventArgse){//利用递归获取他所有的子节点tn=tvCate.getSelectedNode();TreeNodetn2=newTreeNode();getLeafNode(tn,tn2);}}///<summary>///利用递归获取一个节点的所有叶子///</summary>///<paramname="tn">TreeNode</param>///<paramname="al"></param>protectedvoidgetLeafNode(TreeNodemyTn,TreeNodetn2){for(inti=0;i<myTn.ChildNodes.Count;i++){if(myTn.ChildNodes[i].ChildNodes.Count==0){tn2.ChildNodes.Add(myTn.ChildNodes[i]);}else{getLeafNode(myTn.ChildNodes[i],tn2);}}}
解决方案
解决方案二:
以前找的一个,你试试js:<scriptlanguage="javascript">//获取元素指定tagName的父元素functionpublic_GetParentByTagName(element,tagName){varparent=element.parentNode;varupperTagName=tagName.toUpperCase();//如果这个元素还不是想要的tag就继续上溯while(parent&&(parent.tagName.toUpperCase()!=upperTagName)){parent=parent.parentNode?parent.parentNode:parent.parentElement;}returnparent;}//设置节点的父节点Cheched——该节点可访问,则它的父节点也必能访问functionsetParentChecked(objNode){varobjParentDiv=public_GetParentByTagName(objNode,"div");if(objParentDiv==null||objParentDiv=="undefined"){return;}varobjID=objParentDiv.getAttribute("ID");objID=objID.substring(0,objID.indexOf("Nodes"));objID=objID+"CheckBox";varobjParentCheckBox=document.getElementById(objID);if(objParentCheckBox==null||objParentCheckBox=="undefined"){return;}if(objParentCheckBox.tagName!="INPUT"&&objParentCheckBox.type=="checkbox")return;objParentCheckBox.checked=true;setParentChecked(objParentCheckBox);}//设置节点的子节点uncheched——该节点不可访问,则它的子节点也不能访问functionsetChildUnChecked(divID){varobjchild=divID.children;varcount=objchild.length;for(vari=0;i<objchild.length;i++){vartempObj=objchild[i];if(tempObj.tagName=="INPUT"&&tempObj.type=="checkbox"){tempObj.checked=false;}setChildUnChecked(tempObj);}}//设置节点的子节点cheched——该节点可以访问,则它的子节点也都能访问functionsetChildChecked(divID){varobjchild=divID.children;varcount=objchild.length;for(vari=0;i<objchild.length;i++){vartempObj=objchild[i];if(tempObj.tagName=="INPUT"&&tempObj.type=="checkbox"){tempObj.checked=true;}setChildChecked(tempObj);}}//触发事件functionCheckEvent(){varobjNode=event.srcElement;if(objNode.tagName!="INPUT"||objNode.type!="checkbox")return;if(objNode.checked==true){setParentChecked(objNode);varobjID=objNode.getAttribute("ID");varobjID=objID.substring(0,objID.indexOf("CheckBox"));varobjParentDiv=document.getElementById(objID+"Nodes");if(objParentDiv==null||objParentDiv=="undefined"){return;}setChildChecked(objParentDiv);}else{varobjID=objNode.getAttribute("ID");varobjID=objID.substring(0,objID.indexOf("CheckBox"));varobjParentDiv=document.getElementById(objID+"Nodes");if(objParentDiv==null||objParentDiv=="undefined"){return;}setChildUnChecked(objParentDiv);}}</script>cs:this.TreeView1.Attributes.Add("onclick","CheckEvent()");
解决方案三:
递归要有返回值,(或者把返回值放在参数里),不论哪个分之,还有你的循环也许春在问题
解决方案四:
///<summary>///利用递归获取一个节点的所有叶子///</summary>///<paramname="tn">TreeNode</param>///<paramname="al"></param>protectedvoidgetLeafNode(TreeNodemyTn,TreeNodetn2){for(inti=0;i<myTn.ChildNodes.Count;i++){if(myTn.ChildNodes[i].ChildNodes.Count>0){getLeafNode(myTn.ChildNodes[i],tn2);}tn2.ChildNodes.Add(myTn.ChildNodes[i]);}}
解决方案五:
你只要叶子啊,汗没看到你的代码应该是可以的报什么错
解决方案六:
你的代码没什么问题呀,把报错信息贴上来看看
解决方案七:
你的代码好像没有什么问题啊
解决方案八:
代码不报错的就是点击了之后,该节点下的子节点就会丢失一个,我不知道怎么会出现这种问题!
解决方案九:
TreeNodetn2=newTreeNode();你声明了一个新的结点,然后递归查找到叶结点,然后就tn2.ChildNodes.Add(myTn.ChildNodes[i]);问题是你这样做就相当于把这个叶结点从树里移动到tn2里,当然就会丢了啊
解决方案十:
我这个tn2不过是一个集合用来暂时存放这些叶节点的,难道说我把这些叶节点加到其他的TreeNode中存放,它会自动把原来的删除掉?那我应该怎么做比较合理啊?请各位高手给个解决的方法吧!
解决方案十一:
一下这是异常信息,请求高手哦!说明:执行当前Web请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。异常详细信息:System.InvalidOperationException:集合已修改;可能无法执行枚举操作。源错误:行98:protectedvoidgetLeafNode(TreeNodetn,refTreeNodeCollectiontnCollection)行99:{行100:foreach(TreeNodechildNodeintn.ChildNodes)行101:{行102:if(childNode.ChildNodes.Count==0)
解决方案十二:
没人理我?高手在哪里?
解决方案十三:
我也遇到了这个问题,很奇怪,在add的时候总是会减掉一个,和C/S下的TreeNode很不一样,所以只能改成用while的方法了while(myTn.ChildNodes.Count>0){tn2.ChildNodes.Add(myTn.ChildNodes[0]);}