用treeview建一个树:
表结构是这样:
id (编号)name(名称) parentid(父类编号)
ID NAME PARENTID
A A第一层 0
A1 A第二层 A
A10 A第三层 A1
A2 A2第三层 A1
.. .. ..
B B第一层 0
B1 B第二层 B
B10 B第三层 B1
生成效果:
A2第三层..
A第一层-A第二层-
A第三层..
b第一层-Ab第二层- b第三层A2第三层..代码:
procedure TfrmTree.FormCreate(Sender: TObject);
begin
AddNode('0',nil,TreeView1);
end;
procedure TfrmTree.AddNode(AID:string;ParentNode:TTreeNode;TmpTreeView:TTreeView);
var MyNode:TTreeNode;
begin
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('select * from Test where ParentID=:Parname order by id ');
AdoQuery1.Parameters.Items[0].Value:=AID;
AdoQuery1.Open;
while not AdoQuery1.Eof do
begin
MyNode:=TmpTreeView.Items.AddChild(ParentNode,AdoQuery1.FieldByName('Name').AsString);
AddNode(AdoQuery1.FieldByName('id').AsString,MyNode,TmpTreeView);
AdoQuery1.Next;
end;
end;
麻烦大家帮看看,还有AdoQuery1在关闭前总是报错“eof或bof有一个是真,所需操作需要一个当前纪录”,而bde的query就没错,是不是ado没有大补丁的原因!我用的是delphi5.0!!!!
表结构是这样:
id (编号)name(名称) parentid(父类编号)
ID NAME PARENTID
A A第一层 0
A1 A第二层 A
A10 A第三层 A1
A2 A2第三层 A1
.. .. ..
B B第一层 0
B1 B第二层 B
B10 B第三层 B1
生成效果:
A2第三层..
A第一层-A第二层-
A第三层..
b第一层-Ab第二层- b第三层A2第三层..代码:
procedure TfrmTree.FormCreate(Sender: TObject);
begin
AddNode('0',nil,TreeView1);
end;
procedure TfrmTree.AddNode(AID:string;ParentNode:TTreeNode;TmpTreeView:TTreeView);
var MyNode:TTreeNode;
begin
AdoQuery1.Close;
AdoQuery1.SQL.Clear;
AdoQuery1.SQL.Add('select * from Test where ParentID=:Parname order by id ');
AdoQuery1.Parameters.Items[0].Value:=AID;
AdoQuery1.Open;
while not AdoQuery1.Eof do
begin
MyNode:=TmpTreeView.Items.AddChild(ParentNode,AdoQuery1.FieldByName('Name').AsString);
AddNode(AdoQuery1.FieldByName('id').AsString,MyNode,TmpTreeView);
AdoQuery1.Next;
end;
end;
麻烦大家帮看看,还有AdoQuery1在关闭前总是报错“eof或bof有一个是真,所需操作需要一个当前纪录”,而bde的query就没错,是不是ado没有大补丁的原因!我用的是delphi5.0!!!!
我试了下,好像有点问题啊,只能列出
第一层-A第二层- A第三层..
这种结果如果最后一层没有子节点,就退出了整个,而没返回到上一级函数!
也就是说A2第三层..a2第二层都显不出来!
id name parentid level算法描述如下:
1. 取得第0层的所有节点(level=0的节点)信息。
2. 作为根节点放入treeview中显示,节点信息中CurrentID赋予当前节点id。
3. 取得当前数据库中节点的最大层次Maxlevel
4. for i:=1 to Maxlevel do
begin
对于每个第I层的节点 do
begin
查找其父节点id
在treeview中挂到其父节点下显示
节点信息中CurrentID赋予当前节点id
end;
end
具体实现参考如下程序:
type
PMyInt = ^TMyInt;
TMyInt = record
CurrentID: string;
end;procedure TCommInfo.FormCreate(Sender: TObject);
var
i,j,Nodes:Integer;
tmpNode,ParentNode: TTreenode;RootNodeTxt,Maxlevel,NodeTxt,sqlStr,ParentID,CurrentID:String;
DataPtr:array[0..10000] of PMyInt;beginwith DataModule2 do
begin Nodes:=0;
TreeView.Enabled:=True;
TreeView.Items.Clear;
ComTypeQuery.SQL.Clear;
ComTypeQuery.SQL.Add('select * from 类别 where parentID=0');
ComTypeQuery.Open;
while not ComTypeQuery.eof do
begin
new(DataPtr[Nodes]);
DataPtr[Nodes]^.CurrentID:=ComTypeQuery.FieldByName('id').AsString;
RootNodeTxt:=ComTypeQuery.FieldByName('name').AsString;
tmpNode:=TreeView.Items.AddObject(nil,RootNodeTxt,DataPtr[Nodes]);
tmpNode.ImageIndex:=0;
tmpNode.SelectedIndex:=1;
Nodes:=Nodes+1;
ComTypeQuery.Next;
end; with ComTypeQuery do
begin
sql.Clear;
sql.Add('select max(level) as maxlevel from 类别');
open;
Maxlevel:=FieldByName('Maxlevel').AsString;
close;
end;
//---------------------建树---------------------
// Nodes:=3;
for i:=1 to StrtoInt(Maxlevel) do
begin
//i:=2;
with ComTypeQuery do
begin
sql.Clear;
sqlStr:='select * from 类别 where level='+IntToStr(i);
sql.Add(sqlStr);
open;
first;
while not eof do
begin
ParentID:=FieldByName('ParentID').AsString;
CurrentID:=FieldByName('id').AsString;
//---------- 查找父结点-----------------------------
j:=0;
repeat
if PMyInt(Treeview.items[j].data)^.CurrentID = ParentID then
begin
ParentNode:=TreeView.items[j];
break;
end; j:=j+1;
until j=TreeView.Items.count; //--------------------------------------- NodeTxt:=FieldByName('name').AsString;
new(DataPtr[Nodes]);
DataPtr[Nodes]^.CurrentID:=CurrentID; tmpNode:=Treeview.Items.AddChildObject(ParentNode,NodeTxt,DataPtr[Nodes]);
tmpNode.ImageIndex:=0;
tmpNode.SelectedIndex:=1;
Nodes:=Nodes+1;
next; end; //while
//ParentNode:=nil;
end; //with query
end;//for end;
end;