编码 名称 上级编码
---------------------------------------------------
A001 FFD S
A002 ADDF S
S DSAFSSDF
b001 sdakfsajkfj A001
生成如下树形列表S DSAFSSDF
A001 FFD
b001 sdakfsajkfj
A002 ADDF 目前通过递归方式生成,速度有慢,有没有更快的方法,希望大家帮忙.
---------------------------------------------------
A001 FFD S
A002 ADDF S
S DSAFSSDF
b001 sdakfsajkfj A001
生成如下树形列表S DSAFSSDF
A001 FFD
b001 sdakfsajkfj
A002 ADDF 目前通过递归方式生成,速度有慢,有没有更快的方法,希望大家帮忙.
http://harryfin.spaces.live.com/blog/cns!31E57C5D97ECDF5!411.entry
但是,代价是增删改时,需要update多条记录
Field_PID, Field_caption: WideString);
var
vNode: TTreeNode;
vPNode: TTreeNode;
vList: TStringList;
vIndex: integer;
begin
TreeView.Items.BeginUpdate;
vList := TStringList.Create;
vList.Sorted := True;
try
with ADOQuery1 do
if RecordCount > 0 then
begin
First;
while not Eof do
begin
vNode := Treeview.Items.Add(nil, FieldByName(Field_caption).AsString);
vList.AddObject(FieldByName(Field_ID).AsString, vNode);
if vList.Find(FieldByName(Field_PID).AsString, vIndex) then
vNode.MoveTo(TTreeNode(vList.Objects[vIndex]), naAddChild);
next;
end;
end;
finally
vList.Free;
Treeview.Items.EndUpdate;
end;
end;//自己试试!
//调用方法:
BuildTree(Treeview1,'编码','上级编码','名称');
即使全部记录取到客户端内存,再递归,query的扫描也是不如stringlist的扫描的效率高
将数据一次加载到一个List中,然后在整理成一个树的层次能快一些。
在就是每次只加载展开的节点。
在关键字段跟父类字段名填上就可以了
procedure TFrmMain.Button1Click(Sender: TObject);
procedure getStructrueInfo(vKeyID: string;tnode: TTreeNode);
var
oraQuery1: TOraQuery;
Tnode1: TTreeNode;
begin
oraQuery1 := TOraQuery.Create(nil);
oraQuery1.Session := oraSession1;
try
with oraQuery1 do
begin
close;
if vKeyID='' then
begin
sql.Text := ' select bh,name,pbh from test_t where pbh is null order by bh';
end else
begin
sql.Text := ' select bh,name,pbh from test_t where pbh=:pbh order by bh';
ParamByName('pbh').Value := vKeyID;
end;
Open;
while not eof do
begin
if tnode=nil then
begin
if Trim(FieldByName('name').AsString)<>'' then
Tnode1 := TreeView1.Items.add(nil,FieldByName('name').AsString);
Tnode1.ImageIndex := 0;
end else
begin
if Trim(FieldByName('name').AsString)<>'' then
Tnode1 := TreeView1.Items.AddChild(tnode,FieldByName('name').AsString);
Tnode1.ImageIndex := 1;
end;
getStructrueInfo(FieldByName('bh').AsString,Tnode1);
Next;
end;
end;
finally
oraQuery1.Free;
end;
end;
begin
TreeView1.Items.Clear;
getStructrueInfo('',nil);
TreeView1.FullExpand;
end;
控件里有树形控件啊
你这样
那还不如直接用SQL显示出树形结构,就行了
你这样还一次一次去SQL查询,这样SQL的成本不是更高?