树结构数据装入delphi的TTreeview组件中
2006-02-21 10:33
274 查看
树结构数据装入delphi的TTreeview组件中
数据库结构
Create table zhibiaotb (id int primary key,name varchar(100),type int ,upid int)
首先定义 树结点的结构:
TUnitNodeInfo = record
ID: integer;
Name: string;
unitType: integer;
Upid: integer;
end;
PUnitNodeInfo = ^TUnitNodeInfo;
装入过程:
procedure Tfrminput.CreateTree(TreeNode: TTreeNode; Upid: integer; xtype: integer);
var
I: integer;
PNodeInfo: PUnitNodeInfo;
TmpTreeNode: TTreeNode;
ID: integer;
Tmpid: integer;
TmpUpid: integer;
mtype: integer;
begin
ADOQuery1.Filtered := false;
ADOQuery1.Filter := Format('upid=%d and type=%d', [Upid, xtype]);
ADOQuery1.Filtered := true;
ADOQuery1.First;
TmpTreeNode := TreeNode;//保存该递归层的节点位置,以便下层能返回上层
for I := 0 to ADOQuery1.RecordCount - 1 do
begin
TreeNode := TreeView1.Items.AddChild(TreeNode, ADOQuery1.FieldByName('name').AsString + '-' + ADOQuery1.FieldByName('ID').AsString);
New(PNodeInfo);//产生树结点关联数据
with PNodeInfo^ do
begin
ID := ADOQuery1.FieldByName('id').AsInteger;
Name := ADOQuery1.FieldByName('name').AsString;
unitType := ADOQuery1.FieldByName('type').AsInteger;
Upid := ADOQuery1.FieldByName('upid').AsInteger;
end;
TreeNode.Data := PNodeInfo;
Tmpid := ADOQuery1.FieldByName('id').AsInteger;//保存该层的数据
TmpUpid := ADOQuery1.FieldByName('upid').AsInteger;;//保存该层的数据
CreateTree(TreeNode, ADOQuery1.FieldByName('id').AsInteger, xtype);//递归建下级树结点
//从下层跳到上层
ADOQuery1.Filtered := false;
ADOQuery1.Filter := Format('upid=%d and type=%d', [TmpUpid, xtype]);
ADOQuery1.Filtered := true;
ADOQuery1.Locate('id', Tmpid, []);
TreeNode := TmpTreeNode;
ADOQuery1.Next;
end;
end;
调用示例:
try
Adocnn.Close;
Adocnn.Open;
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Select id,name,type,upid from zhibiaotb';
ADOQuery1.Open;
TreeView1.Items.BeginUpdate;
CreateTree(nil, -1, 1);
CreateTree(nil, -1, 2);
CreateTree(nil, -1, 3);
TreeView1.FullExpand;
TreeView1.Items.EndUpdate;
except
end;
一点小技巧:
如果树结构数据来自两个表,则可以用union语法把两个表的数据组成一个树结构
Example:
Create table Depart (depid int,name,upid int)
Create table Member(Memberid int ,name name ,Depid int)
组成一个表如下:Select Depid as id,name,upid union select memberid as id,name,Depid as upid
数据库结构
Create table zhibiaotb (id int primary key,name varchar(100),type int ,upid int)
首先定义 树结点的结构:
TUnitNodeInfo = record
ID: integer;
Name: string;
unitType: integer;
Upid: integer;
end;
PUnitNodeInfo = ^TUnitNodeInfo;
装入过程:
procedure Tfrminput.CreateTree(TreeNode: TTreeNode; Upid: integer; xtype: integer);
var
I: integer;
PNodeInfo: PUnitNodeInfo;
TmpTreeNode: TTreeNode;
ID: integer;
Tmpid: integer;
TmpUpid: integer;
mtype: integer;
begin
ADOQuery1.Filtered := false;
ADOQuery1.Filter := Format('upid=%d and type=%d', [Upid, xtype]);
ADOQuery1.Filtered := true;
ADOQuery1.First;
TmpTreeNode := TreeNode;//保存该递归层的节点位置,以便下层能返回上层
for I := 0 to ADOQuery1.RecordCount - 1 do
begin
TreeNode := TreeView1.Items.AddChild(TreeNode, ADOQuery1.FieldByName('name').AsString + '-' + ADOQuery1.FieldByName('ID').AsString);
New(PNodeInfo);//产生树结点关联数据
with PNodeInfo^ do
begin
ID := ADOQuery1.FieldByName('id').AsInteger;
Name := ADOQuery1.FieldByName('name').AsString;
unitType := ADOQuery1.FieldByName('type').AsInteger;
Upid := ADOQuery1.FieldByName('upid').AsInteger;
end;
TreeNode.Data := PNodeInfo;
Tmpid := ADOQuery1.FieldByName('id').AsInteger;//保存该层的数据
TmpUpid := ADOQuery1.FieldByName('upid').AsInteger;;//保存该层的数据
CreateTree(TreeNode, ADOQuery1.FieldByName('id').AsInteger, xtype);//递归建下级树结点
//从下层跳到上层
ADOQuery1.Filtered := false;
ADOQuery1.Filter := Format('upid=%d and type=%d', [TmpUpid, xtype]);
ADOQuery1.Filtered := true;
ADOQuery1.Locate('id', Tmpid, []);
TreeNode := TmpTreeNode;
ADOQuery1.Next;
end;
end;
调用示例:
try
Adocnn.Close;
Adocnn.Open;
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'Select id,name,type,upid from zhibiaotb';
ADOQuery1.Open;
TreeView1.Items.BeginUpdate;
CreateTree(nil, -1, 1);
CreateTree(nil, -1, 2);
CreateTree(nil, -1, 3);
TreeView1.FullExpand;
TreeView1.Items.EndUpdate;
except
end;
一点小技巧:
如果树结构数据来自两个表,则可以用union语法把两个表的数据组成一个树结构
Example:
Create table Depart (depid int,name,upid int)
Create table Member(Memberid int ,name name ,Depid int)
组成一个表如下:Select Depid as id,name,upid union select memberid as id,name,Depid as upid
相关文章推荐
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到excel的组件实例)
- Rocksdb源码剖析(2)--基础数据结构(组件)1
- Delphi中根据分类数据生成树形结构的最优方法
- jQuery EasyUI框架中的Datagrid数据表格组件结构详解
- Flex4 在advanceddatagrid组件中以“树形结构”显示数据
- 转:Firebird 数据访问组件 (Delphi)
- Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)
- 深入云存储系统Swift核心组件:Ring数据结构及构建、重平衡操作
- 标准功能模块组件 -- “文档管理组件,网络文档管理,网络存储”,B/S版本组件可独立运行,也可集成到其他项目里,数据结构清晰思路严谨
- 了解LDAP协议、数据结构与条目组件
- 标准功能模块组件 -- “文档管理组件,网络文档管理,网络存储”,B\S版本组件可独立运行,也可集成到其他项目里,数据结构清晰思路严谨
- Firebird 数据访问组件 (Delphi)
- delphi利用指针,结构或component存储数据表数据
- Delphi中将XML文件数据装入DataSet
- TWebBrowser组件在DELPHI中POST数据和取得网页源文件
- Decal SDL-Delphi的范型类库-通用数据结构与算法类库(一)
- 标准功能模块组件 -- “文档管理组件,网络文档管理,网络存储”,B/S版本组件可独立运行,也可集成到其他项目里,数据结构清晰思路严谨
- Delphi中根据分类数据生成树形结构的最优方法
- Delphi中根据分类数据生成树形结构的最优方法