问题描述
我的类别设置是这样的3个长度为一个级别表tableABC1000类别12001类别23002类别34000000类别115001000类别216002001类别32怎么写递归把所有类别输出,求完整代码c#,谢谢,急用
解决方案
解决方案二:
TreeNodenode=newTreeNode();node.Text="dgd服务器";node.Value="0";Stringsql="selectnamefromsysdatabases";dt=SqlHelper.gettable(sql,"master").Tables[0];buildtree(node,dt);buildtreeye(node);TreeView1.Nodes.Add(node);for(inti=0;i<node.ChildNodes.Count;i++){node.ChildNodes[i].CollapseAll();}publicvoidbuildtree(TreeNodenode,DataTabledtgen){for(inti=0;i<dtgen.Rows.Count;i++){TreeNodegen=newTreeNode();gen.Text=dtgen.Rows[i][0].ToString();node.ChildNodes.Add(gen);}}publicvoidbuildtreeye(TreeNodenode){stringsql="selectnamefromsysobjectswherextype='u'";for(inti=0;i<node.ChildNodes.Count;i++){dt=SqlHelper.gettable(sql,node.ChildNodes[i].Text).Tables[0];for(intj=0;j<dt.Rows.Count;j++){buildtree(node.ChildNodes[i],dt);}}}
解决方案三:
试着写了下,没做测试,你试试。System.Data.DataTabledt;//设你已经查询出了DataTable,做为全局变量,当然做为参数传递也可以。//==========================================TreeViewtv=newTreeView();//新建一个TreeViewSystem.Data.DataRow[]drs=dt.Select();foreach(System.Data.DataRowdrindrs){//将根目录加入if(IsSubClass("",dr["B"].ToString(),0)){TreeNodetn=newTreeNode();tn.NavigateUrl="showclass.aspx?id"+dr["A"].ToString();tn.Text=dr["C"].ToString();tv.CheckedNodes.Add(tn);AddClass(dr["B"].ToString(),tn,1);//加子目录}}//===========================publicvoidAddClass(stringpid,TreeNodepnode,intdepth){System.Data.DataRow[]drs=dt.Select();foreach(System.Data.DataRowdrindrs){if(IsSubClass(pid,dr["B"],depth+1)){//判断为子目录TreeNodetn=newTreeNode();tn.NavigateUrl="showclass.aspx?id"+dr["A"].ToString();tn.Text=dr["C"].ToString();pnode.ChildNodes.Add(tn);AddClass(dr["B"].ToString(),tn,depth++);//递归}}}publicboolIsSubClass(stringpid,stringcid,intdepth){//判断该目录是否为指定目录的子目录if(cid.Length==3&&depth==0)//根目录深度为0,长度为3returntrue;//根目录elseif(cid.Length>(depth+1)*3) //子目录长度为深度+1乘3returnfalse;elseif(cid.Substring(0,cid.Length-3)!=pid)//子目录除后面3个数外前面应与父目录的字串一样returnfalse;elsereturntrue;}
解决方案四:
DataTable的Select应该可以过滤如dt.Select("Blike'"+pid+"???'"); 这样返回的DataRow数量应该少点,开销小点,不过这方法我没试过,所以没写出来,你试试。
解决方案五:
表tableA(ID)B(ParentID)C10类别120类别230类别341类别1152类别2163类别32也就是ParentID写的是ID的编号。代码如下。///<summary>///递归添加树的节点///</summary>///<paramname="ParentID"></param>///<paramname="pNode"></param>publicvoidAddDefaultTree(intParentID,TreeNodepNode){try{DataViewdvTree=newDataView();dvTree=//返回数据;//过滤ParentID,得到当前的所有子节点dvTree.RowFilter="[PARENTID]="+ParentID;foreach(DataRowViewRowindvTree){TreeNodeNode=newTreeNode();if(pNode==null){//添加根节点Node.NavigateUrl=Row["TargetURL"].ToString();Node.Target=Row["TargetWindow"].ToString();Node.Text="<imgsrc='images/main/leftmenuicon4.gif'border='0'hspace='3'align='absmiddle'><spanonmousemove=javascript:title='"+Row["MenuName"]+"'>"+Row["MenuName"].ToString().Trim()+"</span>";this.OAModualMenu.Nodes.Add(Node);Node.Expanded=false;AddTree(Int32.Parse(Row["MenuID"].ToString()),Node);//再次递归}else{//添加当前节点的子节点Node.Text="<Litype='square'><spanonmousemove=javascript:title='"+Row["MenuName"].ToString()+"'>"+Row["MenuName"].ToString().Trim()+"</span></Li>";Node.NavigateUrl=Row["TargetURL"].ToString();Node.Target=Row["TargetWindow"].ToString();pNode.Nodes.Add(Node);Node.Expanded=false;AddTree(Int32.Parse(Row["MenuID"].ToString()),Node);//再次递归}}}catch{}}//调用,比如在Page_Load()事件中://调用递归函数,完成树形结构的生成this.AddTree(0,(TreeNode)null);
解决方案六:
循序递归啊。你还是看算法去啊
解决方案七:
类别与类别没有关联吗?最好创建关联。子父关系?
解决方案八:
递归添加!!!!
解决方案九:
学习
解决方案十:
///<summary>///递归添加树的节点///</summary>///<paramname="ParentID"></param>///<paramname="pNode"></param>publicvoidAddTree(intParentID,TreeNodepNode){DataSetds=(DataSet)this.ViewState["ds"];DataViewdvTree=newDataView(ds.Tables[0]);//过滤ParentID,得到当前的所有子节点dvTree.RowFilter="[parentId]="+ParentID;foreach(DataRowViewRowindvTree){TreeNodeNode=newTreeNode();if(pNode==null){//添加根节点Node.Text=Row["name"].ToString();TreeView1.Nodes.Add(Node);//Node.Expanded=false;//是否展开若设置为true则ExpandLevel="1"无效AddTree(Int32.Parse(Row["ID"].ToString()),Node);//再次递归}else{//添加当前节点的子节点Node.Text=Row["name"].ToString();//Node.Target=mainFrame;Node.NavigateUrl=Row["url"].ToString();pNode.Nodes.Add(Node);//Node.Expanded=false;AddTree(Int32.Parse(Row["ID"].ToString()),Node);//再次递归}}}}}
解决方案十一:
zc
解决方案十二:
publicvoidCondata() //获取数据{empid=Session[OilPipe.PubInfo.PublicInfo.sEmpID].ToString();username=Session[OilPipe.PubInfo.PublicInfo.sUserName].ToString();StringBuildersb=newStringBuilder();if(Session[OilPipe.PubInfo.PublicInfo.sUserAdminFlag].ToString()=="Y"){sb.Append("SELECTDIR_IDDIR_ID,FATHER_IDFATHER_ID,DIR_NAMEDIR_NAME");sb.Append("FROMOP_DIRORDERBYDIR_ID");}else{sb.Append("SELECTDIR_IDDIR_ID,FATHER_IDFATHER_ID,DIR_NAMEDIR_NAME");sb.Append("FROMOP_DIR");sb.Append("WHEREfile_ctl.dir_aprv(dir_id,'"+empid+"','10')='Y'");sb.Append("ORDERBYDIR_ID");}stringsql=sb.ToString();DataSetds=dbop.ExecSQLReDataSet(sql);this.ViewState["ds"]=ds;AddTree(startnode,(TreeNode)null);}publicvoidAddTree(stringid,TreeNodepNode){DataSetds=(DataSet)this.ViewState["ds"];DataViewdv=newDataView(ds.Tables[0]);//取出数据填充数据视图dv.RowFilter="FATHER_ID='"+id+"'";//用数据视图进行子节点筛选把所有的子当前下的所有子节点筛选foreach(DataRowViewrowindv){TreeNodenode=newTreeNode();if(pNode==null)//说明是页节点{node.Text=row["DIR_NAME"].ToString();//从行视图中取出字段的值node.ToolTip=row["DIR_NAME"].ToString();node.NavigateUrl=url+"?dirId="+row["DIR_ID"].ToString();node.Target=target;TreeView1.Nodes.Add(node);//添加子节点AddTree(row["DIR_ID"].ToString(),node);//递归调用}else//如果子节点再继续递归{node.ToolTip=row["DIR_NAME"].ToString();node.Text=row["DIR_NAME"].ToString();node.NavigateUrl=url+"?dirId="+row["DIR_ID"].ToString();node.Target=target;pNode.ChildNodes.Add(node);AddTree(row["DIR_ID"].ToString(),node);}}}项目原版代码,我直接粘过来的
解决方案十三:
publicvoidInitTree(TreeViewtree,DataSetds,boolexpand){tree.Nodes.Clear();if(null==ds)return;if(ds.Tables.Count<=0)return;DataRow[]rowList=ds.Tables[0].Select(TableTree.FATHERID+"='-1'",TableTree.ORDERBY);foreach(DataRowrowinrowList){TreeNodenode=newTreeNode();node.Text=row[TableTree.DESN].ToString();node.NavigateUrl="MainManage.aspx?TableName="+row[TableTree.TABLENAME].ToString()+"&TreeID="+row[TableTree.TABLETREEID].ToString();node.Target="Main";node.Value=row[TableTree.TABLETREEID].ToString()+"|"+row[TableTree.TABLENAME].ToString();tree.Nodes.Add(node);CreateSubTree(node,ds,expand);}}///<summary>///创建树的子结点///</summary>publicvoidCreateSubTree(TreeNodeparentNode,DataSetds,boolexpand){stringvalue=parentNode.Value.Substring(0,parentNode.Value.IndexOf("|"));DataRow[]rowList=ds.Tables[0].Select(TableTree.FATHERID+"='"+value+"'",TableTree.ORDERBY);foreach(DataRowrowinrowList){TreeNodenode=newTreeNode();node.Text=row[TableTree.DESN].ToString();node.NavigateUrl="MainManage.aspx?TableName="+row[TableTree.TABLENAME].ToString()+"&TreeID="+row[TableTree.TABLETREEID].ToString();node.Target="Main";node.Value=row[TableTree.TABLETREEID].ToString()+"|"+row[TableTree.TABLENAME].ToString();parentNode.ChildNodes.Add(node);CreateSubTree(node,ds,expand);}}
解决方案十四:
上面代码都写了,没啥好写的了。楼主还不结帖?
解决方案十五:
如果类别代号是类似固定格式,可以先按代号排序,保证父在子前面,之后循环添加节点,可以不用递归,再建一个Hash表存类别代号和TreeNode的对应关系用来查找,可以更快一些.