读书人

100务实现一个通用建树函数,请各位来支

发布时间: 2013-03-10 09:38:39 作者: rapoo

100求实现一个通用建树函数,请各位来支支招
本帖最后由 chadwick 于 2012-11-26 11:35:35 编辑 想实现一个通用的建树函数,用Treeview实现,函数声明类似如下:
function IniTree(arSqlStr:array of String;Level:Integer)

arSqlStr是一个SQL语句的数组,Level是对应数组的个数,
如arSqlStr有两个元素,即Level是2传入,生成的树就是两层.
如我输入的level是2,
第一层返回的数据是
a
b
第二层返回的数据是
a a1
a a2
b b1
那么结果就是
+a
+--a1
+--a2
+b
+--b1

固定层数还好办.现在就想做一个能动态层数的.
以上是我设想的函数声明,大伙可以完善一下,本人才疏,算法比较差,想不通啊,向大家求解一下.谢谢,
[解决办法]
数据库的树型结构,最理想的是2个控制字段
ID ParentID (Name and more..)
int int

如果ParentID=0则是顶级目录,如果ParentID>0,则归属于该ID的目录下,这样无论是显示还是调整结构都非常方便.
显示时,
procedure ShowToTreeView(Tree : TTreeView; ParentNode : TTreeNode; ParentID : integer);
然后用这个函数递归,整个树就显示出来了.
[解决办法]
给你一个数据库的部门树生成:

数据库:
AutoID ID Dname ParentID leave ShortName
14101北京公司01A
14202深圳公司01B
14303上海公司01C
1440301资讯部032F
149030101硬件组03013
150030102软件组03013
14504香港公司01D
14605武汉仓库01E


{--------------------------读树-----------------------------}
procedure TMainForm.ReadTree(tnode:TTreeNode;Fvalue: String);
Var
i: integer;
Flist:TStringList;
Flist1:TStringList;
str,s:string;
snode:TTreeNode;
begin
qryTree.close;
qryTree.sql.clear;
qryTree.sql.add('select did,dname,Parentid from depart where isnull(Parentid,'''')='''+Fvalue+''' '+Fittree+' ');
qryTree.Open;
qryTree.First;
Flist:=TStringList.Create;
Flist1:=TStringList.Create;
while not qryTree.eof do
begin
Flist.Add(trim(qryTree.fieldbyname('dname').asstring));
Flist1.Add(qryTree.fieldbyname('did').asstring);
qryTree.next;
end;

for i:= 0 to flist.Count-1 do
begin
s:=flist1.Strings[i];
str:=flist.Strings[i];
snode:=Treeview1.items.addchild(tnode,str);
ReadTree(snode,s);
end;
flist.free;
flist1.free;
end;


//调用
ReadTree(RootNode1,'0');
[解决办法]
就是个递归吗,你可以参考treeview的loadfile
[解决办法]
可以把树理解为一种数据结构,如果要实现通用建树,就要实现底层数据结构。
[解决办法]
id, parent是可以使用构建树方法,有递归的,有非递归的,递归的效率不高,非递归的网上介绍也很多。有种使用stringlist二分查找的效率较高。

读书人网 >.NET

热点推荐