波斯马BOSSMA Information Technology

树形结构获取每一个节点的级次

发布时间:2010年5月15日 / 分类:DOTNET / 10,618 次浏览 / 评论

有时候需要获取树形结构每一个节点的级次,以方便处理,最近也处理了一些这方面的问题,这里提供两个方法:使用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);
??????????????????? }
??????????????? }
??????????? }
本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《树形结构获取每一个节点的级次

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论