这里以这样的树为例:
根
a
a1
a2
b
b1
b2
c
c1
c2
c2d
创建数据库:
CREATE TABLE [Tree] ( [ID] [bigint] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
--这里仅比楼主的例子多了名称列,为了看起来方便。
[PID] [bigint] NULL ,
[showLevel] [tinyint] NULL ,
CONSTRAINT [PK_Tree] PRIMARY KEY CLUSTERED
(
[ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO
插入数据内容为
ID Name PID ShowLevel
1 根节点 0 1
2 a 1 1
3 b 1 2
4 c 1 3
5 a1 2 1
6 a2 2 2
7 b1 3 1
8 b2 3 2
9 c1 4 1
10 c2 4 2
11 c2d 10 1
编程:使用一个Button,一个ListView,全部是默认的属性
在Button中的OnClick事件中写如下代码
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
Cnt:Integer;
PID:Integer;
RootNode:TTreeNodes;
TreeNodes:Array of TTreeNode;
CurrNode:TTreeNode;
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * from Tree order by pid,ShowLevel'); //排序至关重要
ADOQuery1.Open;
Cnt:=ADOquery1.RecordCount;
SetLength(TreeNodes,Cnt);
RootNode:=TreeView1.Items;
//节点信息赋值
for i:=0 to Cnt-1 do
begin
ADOQuery1.RecNo:=i+1;
PID:=AdoQuery1.fieldByName('PID').AsInteger;
if PID=0 then
begin
//根节点
TreeNodes[i]:=TreeView1.Items.Add(nil,ADOQuery1.FieldByname('Name').AsString);
TreeNodes[i].Data:=Pointer(ADOQuery1.FieldByName('ID').AsInteger);
end
else
begin
//子节点
//查找索引值
for j:=0 to Treeview1.Items.Count-1 do
begin
if Int64(Treeview1.Items[j].Data)=PID then
begin
CurrNode:=TreeView1.Items[j];
end;
end;
//TreeNodes[i]:=TreeView1.Items.AddChild(TreeNodes[PID-1],ADOQuery1.FieldByname('Name').AsString);
TreeNodes[i]:=TreeView1.Items.AddChild(CurrNode,ADOQuery1.FieldByname('Name').AsString);
TreeNodes[i].Data:=Pointer(ADOQuery1.FieldByName('ID').AsInteger);
end;
end;
end;