数据库的树型结构,最理想的是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 141 01 北京公司 0 1 A 142 02 深圳公司 0 1 B 143 03 上海公司 0 1 C 144 0301 资讯部 03 2 F 149 030101 硬件组 0301 3 150 030102 软件组 0301 3 145 04 香港公司 0 1 D 146 05 武汉仓库 0 1 E {--------------------------读树-----------------------------} 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');
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
141 01 北京公司 0 1 A
142 02 深圳公司 0 1 B
143 03 上海公司 0 1 C
144 0301 资讯部 03 2 F
149 030101 硬件组 0301 3
150 030102 软件组 0301 3
145 04 香港公司 0 1 D
146 05 武汉仓库 0 1 E
{--------------------------读树-----------------------------}
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.loadfromfile(文本文件)