关于递归数据时序号列怎么实现的问题请教!!!!!!!!!!!!!!!!!!

问题描述

我现在页面上显示的树结构:0:董事长1:财务总监2:财务主管3:出纳员3:报销员4:......2:税务主管3:......1:人事总监2:人事主管3:招聘4:办事员1:销售总监1:......2:...我要实现的内容是把上面这个树结构转换下面这个内容,内容显示没有问题,但是序号怎么弄没有思路了,如下:序号职务1董事长1.1财务总监1.1.1财务主管1.1.1.1出纳员1.1.1.2报销员1.1.1.1.1...1.2人事总监1.2.1人事主管1.2.1.1招聘1.2.1.1.1办事员1.3销售总监1.4......我现在数据库的结构是:parentchild董事长财务总监董事长人事总监董事长销售总监财务总监财务主管财务总监税务主管财务主管出纳员财务主管报销员...上面的这个序号(1,1.1,1.1.1,...)这个怎么实现呢?我现在使用的算法是递归,算法不能改了,结构不能改了,1级可以指定就是”董事长“,然后递归董事长下面的子级,就是这个序号怎么实现,请大神指教!!

解决方案

解决方案二:
从父集索引到自己,叠加即可
解决方案三:
已经是树了,还弄那么多点,有什么用啊非要这样,你直接把数据库里的序号改了比如原来是4,挂在1-2-3的下面,直接变成1.2.3.4,读取出来就也是这个号.
解决方案四:
既然有树了,那还不简单stringid="";while(node.Parent==null){id=node.Parent.id+""+id;node=node.Parent;}
解决方案五:
可以转成二叉树,然后用数组保存的方式保存,然后遍历数组就知道谁是root谁是child,遍历的时候就可以字符串加1.2.3这样。但是你说代码不能改结构不能改所以解决办法是。你做个字典吧map[董事长]="1"map[财务总监]="1.1"map[财务主管]="1.1.1"...最简单的办法是最有效的剩下的你应该明白了吧.
解决方案六:
我这个树不是固定的,上面只是我举的一个例子,实际上数据是变换的!
解决方案七:
stringid="";while(node.Parent==null){id=node.Parent.id+""+id;node=node.Parent;}

我现在数据库结构是改不了的,公司的项目,Parent.id,没有.id这个属性!
解决方案八:
要实现递归,对象上必须要绑定父节点的id,sostaticvoidMain(string[]args){List<Node>nodeList=CreateTestNodeList();DeepTestdt=newDeepTest();IDictionary<int,string>map=dt.CreatePrefix(nodeList);Deep(0,nodeList,map);}privatestaticvoidDeep(intparentId,List<Node>nodeList,IDictionary<int,string>map){foreach(NodenodeinnodeList.Where(item=>item.ParentID==parentId)){Console.WriteLine("{0}{1}",map[node.ID],node.ID);Deep(node.ID,nodeList,map);}}privatestaticList<Node>CreateTestNodeList(){List<Node>m_NodeList=newList<Node>(500);intindex=1;//rootm_NodeList.Add(newNode{ID=index});//一级子节点do{m_NodeList.Add(newNode{ID=++index,ParentID=1});}while(index<=10);//二级字节点foreach(Nodeiteminm_NodeList.Where(node=>node.ParentID==1).ToList()){do{m_NodeList.Add(newNode{ID=++index,ParentID=item.ID});}while(index%10!=0);}returnm_NodeList;}}classNode{publicintID{get;set;}publicintParentID{get;set;}}classDeepTest{///<summary>///生成节点的标题编号///</summary>///<paramname="nodeList">所有节点集合</param>///<returns>标题编号字典,key:节点id,value:编号</returns>publicIDictionary<int,string>CreatePrefix(List<Node>nodeList){intindex=1;IDictionary<int,string>map=newDictionary<int,string>(nodeList.Capacity);//遍历找到所有根节点foreach(NoderootinnodeList.Where(item=>item.ParentID==0)){stringprefix=index.ToString();map[root.ID]=prefix;Deep(root,nodeList,map);index++;}returnmap;}///<summary>///递归生成节点的标题编号///</summary>///<paramname="root">当前根节点</param>///<paramname="nodeList">所有节点集合</param>///<paramname="map">标题编号字典</param>privatevoidDeep(Noderoot,List<Node>nodeList,IDictionary<int,string>map){intid=root.ID,index=1;foreach(NodenodeinnodeList.Where(item=>item.ParentID==id)){stringprefix=map[id]+"."+index.ToString();map[node.ID]=prefix;index++;Deep(node,nodeList,map);}}}

解决方案九:
publicvoidCreateTree(stringlineNumber,intparentKey,List<object>datasource)
解决方案十:
引用6楼luluxiaoniu88的回复:

stringid="";while(node.Parent==null){id=node.Parent.id+""+id;node=node.Parent;}

我现在数据库结构是改不了的,公司的项目,Parent.id,没有.id这个属性!

遍历一下树的所有结点,会不会?
解决方案十一:
使用递归实现系统导航示例//加载根节点开始递归调用填充TreeView树形控件protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){//获取数据连接语句,并创建数据库连接对象myConn=DBClass.GetConnection();CreateDataSet();InitTree(TreeView1.Nodes,"0");}}//选择数据库数据建立数据集对象返回数据publicDataSetCreateDataSet(){query="select*fromtbTree";myAdapter=newSqlDataAdapter(query,myConn);data=newDataSet();myAdapter.Fill(data,"tree");returndata;}//CodeGo.net///从DataSet中取数据建树//从根节点开始递归调用显示子树publicvoidInitTree(TreeNodeCollectionNds,stringparentId){TreeNodeNewNode;//data为存储建树数据信息的数据集//用父节点进行筛选数据集中信息DataRow[]rows=data.Tables[0].Select("parent_Id='"+parentId+"'");foreach(DataRowrowinrows){NewNode=newTreeNode(row["title"].ToString(),//设置父节点row["Files_Id"].ToString(),"images/1.gif",row["NavigateUrl"].ToString(),"");Nds.Add(NewNode);InitTree(NewNode.ChildNodes,row["Files_Id"].ToString());//添加子节点}}//点击节点跳转到指定页面protectedvoidTreeView1_SelectedNodeChanged1(objectsender,EventArgse){intnodeId=Convert.ToInt32(TreeView1.SelectedValue);//获取TreeView控件选择的值stringurl=DBClass.GetUrl(nodeId);//获取指定地址Response.Redirect(url.ToString());//转到指定页}//从数据库中获取控件中某个节点的关联地址publicstaticstringGetUrl(intfilesId){//获得url地址SqlConnectionmyConnection=GetConnection();SqlCommandmyCommand=newSqlCommand("GetUrl",myConnection);myCommand.CommandType=CommandType.StoredProcedure;//添加参数SqlParameterFilsesId=newSqlParameter("@FilesId",SqlDbType.Int,4);FilsesId.Value=filesId;myCommand.Parameters.Add(FilsesId);//添加参数SqlParameterUrl=newSqlParameter("@Url",SqlDbType.NVarChar,100);Url.Direction=ParameterDirection.Output;myCommand.Parameters.Add(Url);//执行存储过程myConnection.Open();myCommand.ExecuteNonQuery();stringurl=Url.Value.ToString();myCommand.Dispose();myConnection.Dispose();returnurl;}
解决方案十二:
引用6楼luluxiaoniu88的回复:

stringid="";while(node.Parent==null){id=node.Parent.id+""+id;node=node.Parent;}

我现在数据库结构是改不了的,公司的项目,Parent.id,没有.id这个属性!

他给了你一个解题思路,没有ID这个属性的话,你就自己造一个呗。我的思路是这样的:在你生成树的时候,就可以得到你所需要的序号了。第一步,先生成根节点,也就是董事长的那个节点,设置那个节点的.tag=1,.Text=.tag+董事长。第二步,查找董事长的所有下属,将下属作为子节点加入到董事长节点下面,添加方式为.tag=父节点.tag+"."+这个下属的序号.Text=.tag+职务名称第三步,仿照第二步,查找第二步添加的下属的所有下属,然后加入树中。如果看到这里你已经明白了的话,就可以用递归来实现了。

时间: 2024-09-30 04:40:44

关于递归数据时序号列怎么实现的问题请教!!!!!!!!!!!!!!!!!!的相关文章

FAQ系列 | 写新数据时某列值总是被自动修改

0.导读 往表里写入新数据时,却一直报告主键冲突,某列值一直被重置为一个固定值,疑似被黑,啥情况? 1.问题描述 某朋友的线上数据库,怀疑被侵入了.具体表象是:INSERT的时候,某列值总被自动改成一个固定值. 他们先自查了 TRIGGER 和 EVENT,都是空的,确定不是因为这两种原因引起,实在想不出是哪里被动了手脚. 问题的现象: MariaDB [information_schema]> use bbs9; Reading table information for completion

数据库取数据时怎么才能只取前10列的值

问题描述 数据库取数据时怎么才能只取前10列的值.不是前10行. 解决方案 解决方案二:不知道各个列的列名解决方案三:从系统表入手,表名称在sysobjects中,字段名称在syscolumns中,字段序号为syscolums.colidselecttop10b.namefromsysobjectsa,syscolumnsbwherea.id=b.idanda.xtype='U'anda.name='table_name'--此处换成要查找表名称orderbyb.colid 解决方案四:sele

编程-VFP 更新表数据时自动把系统时间写入表中指定一列插入 如何实现自动写入数据

问题描述 VFP 更新表数据时自动把系统时间写入表中指定一列插入 如何实现自动写入数据 VFP编程 现有 成绩 用户 两表 成绩表 三列 成绩 修改时间 用户 用户表 两列 用户名 密码 其中插入与更新成绩后,自动提取系统时间 写入 "修改时间列"( 包含年月日的时间 ) 并且根据系统登录的用户,将用户名写入成绩表 用户列 修改时间以及 用户 这两列只能通过程序自动写入 不可以人为写入 现有两表 教师 用户 如何实现插入教师表中教师号一列的数据后 自动将数据插入到用户表中 用户名列 用

insert into向access插入数据时,字段名(也就是列的名字)之间有空格,去掉空格,就可以

问题描述 insert into向access插入数据时,字段名(也就是列的名字)之间有空格,去掉空格,就可以 insert into test(Image Name) values ('1233424.tif') 提示是语法错误,问题在Image Name,去掉空格就对,这是为什么??? 解决方案 如果字段名一定要包含空格的话,可以给这一字段加中括号即可正常插入. insert into 表1([Image Name]) values('1233424.tif') 解决方案二: 包含特殊字符的

Excel工作表在复制数据时如何自动调整列宽

  1.启动Excel并打开工作表,在工作表中选择需要复制的数据,按Ctrl+C键复制选择的数据,如图1所示. 图1 选择需要复制的数据 2.切换到粘贴数据的目标工作表,按Ctrl+V键粘贴数据.此时数据被粘贴到该工作表中,但目标工作表中保持原有的列宽,如图2所示. 图2 粘贴数据 3.单击工作表中出现的"粘贴选项"按钮上的下三角按钮,在打开的下拉列表中选择"保留源列宽"选项,如图3所示.此时,数据区域的列宽将自动调整为源数据区域的列宽,如图4所示. 图3 选择&q

MySQL插入数据时插入无效列的解决方法_Mysql

1.错误描述 com.mysql.jdbc.exception:jdbc4.MySQLSyntaxErrorException:Unknown column 'man' in 'field list' 2.错误原因 数据库表中的字段:sno sname sage ssex 插入数据时: sno sname sage man 本来是想插入ssex这个字段的值为"man",结果将man弄成了ssex字段名 3.解决办法 在插入时,给字符串类型的字段值加上双引号

【数据蒋堂】列式存储的另一面

列存是常见的数据存储技术,在许多场景下也确实很有效,因而也被不少数据仓库类产品采用,在业内列存也常常就意味着高性能. 可是,列存真有这么好吗?搜索一下,容易找到的列存缺点一般是针对数据修改的,而对于只读的分析计算任务,却很少能见到较详细的讨论.我们在这里来研究一下这个问题. 对内存计算意义不大 列存的原理很简单:由于磁盘不适合跳动式读取,采用行式存储时在读取数据时会扫描所有列,而一次运算可能只涉及很少的列,这样就会多读很多用不上的数据.采用列存则只需要读取需要用到的列,数据访问量会大幅减少,而大

创建表时考虑列的顺序

创建 创建表时考虑列的顺序创建一个表时表中列的顺序在某些程度上对性能会有一定的影响.(表中的列有数据)Oracle对行数据的存储结构ROW HEADER(行头)和COLUMN DATA(列数据).ROW HEADER存储的信息是一个FLAG BYTE,一个LOCK BYTE 和COLUMN COUNT.COLUMN DATA包含COLUMN LENGTH和COLUMN DATA 关于这些我们可以DUMP个表做一下测试create test as select * from dba_objects

Excel输入新数据时图表自动更新

我有一朋友,是做销售的.他利用Excel图表来记录每天的销售成绩.那天,他打来电话问了这样一个 问题:用Excel来记录每天的销售非常的方便,能够直观地表示出每天的销售成绩,但是因为每天都有新 的数据,所以我不得不每天手动更改图表来使其包含新的数据.有没有一种方法可以让我输入新的数据时 ,图表能自动更新.下面的方法将为他来解决这个问题. 在Excel 97及以后版本中,当选中一个图表数据系列时,工作表中与该数据系列对应的数据区域周围 就会出现边框,这时可以通过简单地拖拽区域边框的角点来扩展数据区