在一张表里建一棵树。
Table->Field->Index_ID,Parent_ID,Field_Name
Index_ID:是指节点编号。
Parent_ID:是指父节点编号。
Field_Name:是指树的节点名。
____________________________________________
|___Index_Id_|___Parent_ID|____Field_Name__|
|_______1____|____0_______|____浙江省______|
|_______2____|____1_______|____杭州市______|
|_______3____|____1_______|____宁波市______|
|_______4____|____2_______|____西湖区______|
|_______5____|____0_______|____江苏省______|
|_______6____|____5_______|____扬州市______|
|_______7____|____5_______|____苏州市______|
结果:
+--浙江省
| |__杭州市
| | |__西湖区
| |__宁波市
|
+----江苏省
|__扬州市
|__苏州市
谢谢!,写得详细点。
Table->Field->Index_ID,Parent_ID,Field_Name
Index_ID:是指节点编号。
Parent_ID:是指父节点编号。
Field_Name:是指树的节点名。
____________________________________________
|___Index_Id_|___Parent_ID|____Field_Name__|
|_______1____|____0_______|____浙江省______|
|_______2____|____1_______|____杭州市______|
|_______3____|____1_______|____宁波市______|
|_______4____|____2_______|____西湖区______|
|_______5____|____0_______|____江苏省______|
|_______6____|____5_______|____扬州市______|
|_______7____|____5_______|____苏州市______|
结果:
+--浙江省
| |__杭州市
| | |__西湖区
| |__宁波市
|
+----江苏省
|__扬州市
|__苏州市
谢谢!,写得详细点。
var
tmpNode : TTreeNode;
ADOquery1 : TADOQuery;
begin
ADOQuery1 := TADOQuery.Create(self);
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.close;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.Text := 'select * from Table where Parent_ID ='+inttostr(ParentID);
ADOQuery1.open;
if ADOQuery1.recordcount > 0 then
begin
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
tmpNode := TreeView1.Items.AddChild(Node,ADOQuery1.FieldByName('Field_Name').AsString);
Newtreeview(tmpNode,ADOQuery1.FieldByName('Index_ID').AsInteger);
ADOQuery1.next;
//dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
end;
end;
ADOQuery1.Free;
end;
if Treeview1.Items<>nil then
Treeview1.Items.Clear;
newtreeview(nil,ADOTable1.FieldByName('Parent_ID').AsInteger);http://expert.csdn.net/Expert/topic/2281/2281015.xml?temp=.5998346
PMyRecord = ^MyRecord;
MyRecord = record
ID : integer;
name:string;
ParentID : integer;
end;//end of recordprocedure TForm1.newtreeview(Node:TTreeNode;ParentID:integer);
var
tmpNode : TTreeNode;
ADOquery1 : TADOQuery;
p : PMyRecord;
begin
ADOQuery1 := TADOQuery.Create(self);
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.close;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.Text := 'select * from 部门表 where 上级部门ID='+inttostr(ParentID);
ADOQuery1.open;
if ADOQuery1.recordcount > 0 then
begin
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
new(p);
p.ID := ADOQuery1.FieldByName('ID').AsInteger;
p.name := ADOQuery1.FieldByName('部门名称').AsString;
p.ParentID := ADOQuery1.FieldByName('上级部门ID').AsInteger;
tmpNode := TreeView1.Items.AddChildObject(Node,p.name,p);
Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsInteger);
ADOQuery1.next;
//dispose(p);//一定要去掉这条语句,不然的话,Treeview中的Data也被dispose掉了。
end;
end;
ADOQuery1.Free;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if Treeview1.Items<>nil then
Treeview1.Items.Clear;
newtreeview(nil,ADOTable1.FieldByName('上级部门ID').AsInteger);
end;
aq1, aq2, aq3: TADOQuery;
node, n1, n2: TTreeNode;
begin
aq1 := TAdoQuery.creat(Application);
aq2 := TADOQuery.create(Application);
aq3 := TADOQuery.create(Application);
aq1.close;
aq1.sql.clear;
aq1.sql.add('select * from t where Parent_ID = 0');
aq1.open;
treeview.items.clear;
treeview.items.beginupdate;
while not aq1.eof do
begin
node := treeview.items.add(nil,aq1.FieldByName('Field_Name').asstring);
aq2.close;
aq2.sql.clear;
aq2.sql.add('select * from t where Parent_ID = ' + '''' + aq1.FieldByName('Index_ID').asstring + '''');
aq2.open;
while not aq2.eof do
begin
n1 := treeview.items.addchild(node, aq2.FieldByName('FieldName').asstring);
aq3.close;
aq3.sql.clear;
aq3.sql.add('select * from t where Parent_ID = ' + '''' + aq2.FieldByName('Index_ID').asstring + '''');
aq3.open;
while not aq3.eof do
begin
n2 := treeview.items.addchild(n1, aq3.FieldByName('FieldName').asstring);
aq3.next;
end;
aq2.next;
end;
aq1.next;
end;
end;
遍历整个表
循环查找树节点,节点最好是代码加名称,只判断代码比较好。
var
i,j,i1,j1:integer;
s,s1:string;
n:integer;
tr:TTreeView;
begin
form1.Table1.Open;
form1.Table1.First;
i:=form1.Table1.RecordCount;
if i>0 then
begin
for j:=0 to i-1 do
begin
s:=form1.Table1.FieldValues['field_name'];
n:=form1.Table1.FieldValues['parent_id'];
if n=0 then
form1.TreeView1.Items.Add(nil,s)
else
begin
form1.Query1.Close;
form1.Query1.SQL.Clear;
form1.Query1.SQL.Add('select * from tablename');
form1.Query1.Open;
s1:=form1.Query1.FieldValues['field_name'];
i1:=form1.TreeView1.Items.Count;
if i1>0 then
begin
for j1:=0 to i1-1 do
begin
if form1.TreeView1.Items.Item[j1].Text=s1 then
form1.TreeView1.Items.AddChild(form1.TreeView1.Items.Item[j],s1);
end;
end;
end;
end;
end;
end;
老兄,我按你的思路来做,没有成功呀,我只能创建以下
例:浙江省
杭州市
西湖区
但是我的
宁波市
江苏省
扬州市
苏州市
都没有创建成功呀,这是怎么回事。
我觉得好像是递归执行Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsInteger);
就没有执行 ADOQuery1.next;
就直接退出来。
请问这是什么问题
var
tmpNode : TTreeNode;
ADOquery1 : TADOQuery;
begin
ADOQuery1 := TADOQuery.Create(self);
ADOQuery1.Connection := ADOConnection1;
ADOQuery1.close;
ADOQuery1.SQL.clear;
ADOQuery1.SQL.Text := 'select * from table where Parent_ID ='+inttostr(ParentID);
ADOQuery1.open;
if ADOQuery1.recordcount > 0 then
begin
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
tmpNode := TreeView1.Items.AddChild(Node,ADOQuery1.FieldByName('Field_Name').AsString);
Newtreeview(tmpNode,ADOQuery1.FieldByName('Index_ID').AsInteger);
ADOQuery1.next;
end;
end;
ADOQuery1.Free;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
newtreeview(nil,0);
end;
///////////////////////////////
刚刚试了一下是好的,楼主可能其他地方有问题