有时候需要获取树形结构每一个节点的级次,以方便处理,最近也处理了一些这方面的问题,这里提供两个方法:使用SQLServer自定义函数和在C#中递归处理。
1、SQLServer 自定义函数
例子表结构
create table tb(id varchar(3) , pid varchar(3) , name varchar(10))
查询指定节点及其所有子节点的函数,修改下这个表值函数就可以满足你的需要了。
level就是节点的级次。
create function f_cid(@ID varchar(3)) returns @t_level table(id varchar(3) , level int) as begin ? declare @level int ? set @level = 1 ? insert into @t_level select @id , @level ? while @@ROWCOUNT > 0 ? begin ??? set @level = @level + 1 ??? insert into @t_level select a.id , @level ??? from tb a , @t_Level b ??? where a.pid = b.id and b.level = @level - 1 ? end ? return end
参考:http://topic.csdn.net/u/20091205/17/93630001-027f-4759-b27b-8397136030a3.html
2、在C#中
(1)使用递归
这里是用一个Project的类,需要换成自己的。
在合适的地方调用这个递归方法:InitTreeNodeGrade(0, 0);
private void InitTreeNodeGrade(int parentID, int grade)
??????? {
??????????? grade++;//级次加一
??????????? foreach (Project objProject in projectList)
??????????? {
//如果是当前节点的子级
??????????????? if (objProject.ParentID == parentID)
??????????????? {
//设置级次
??????????????????? objProject.ProjectGrade = grade;
//递归设置下级节点
??????????????????? InitTreeNodeGrade(objProject.ProjectID, grade);
??????????????? }
??????????? }
??????? }
(2)非递归,使用栈和循环
Stack<Project> st = new Stack<Project>();
??????????? st.Push(projectList[0]);
??????????? while (st.Count > 0)
??????????? {
??????????????? Project objProject = st.Pop();
??????????????? foreach (Project objSubProject in projectList)
??????????????? {
??????????????????? if (objSubProject.ParentID == objProject.ProjectID)
??????????????????? {
??????????????????????? objSubProject.ProjectGrade = objProject.ProjectGrade + 1;
??????????????????????? st.Push(objSubProject);
??????????????????? }
??????????????? }
??????????? }
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论