首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2013-03-10 
100求实现一个通用建树函数,请各位来支支招本帖最后由 chadwick 于 2012-11-26 11:35:35 编辑想实现一个通

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二分查找的效率较高。

热点排行