我的数据库有2张表a表代码 国家
1 中国
2 美国
3 韩国
================
b表城市 代码
北京 1
河南 1
江苏 1
关岛 2
华盛顿 2
旧金山 2
汉城 3
======================
不知道要怎么做才能做成treeview树状呢??谢谢大家了
1 中国
2 美国
3 韩国
================
b表城市 代码
北京 1
河南 1
江苏 1
关岛 2
华盛顿 2
旧金山 2
汉城 3
======================
不知道要怎么做才能做成treeview树状呢??谢谢大家了
type
PType = ^TType;
TType = record
id: Integer;
name: string;
end;procedure TfrmForm.LoadType(pid: Integer; topnode: TTreeNode);
var
sql, ss: string;
n: Integer;
p: PType;
node: TTreeNode;
ds1, ds2: TADOQuery;
begin
sql := 'Select * From A表 Order by 代码';
if pid > 0 then
ss := 'Select * From B表 Where 代码 = ' + IntToStr(pid) + ' Order by 城市'; if pid = 0 then
begin
ds1 := TADOQuery.Create(Self);
ds1.Connection := Conn;
ds1.SQL.Text := sql;
ds1.Open; tv.Items.Clear;
New(p);
p^.id := 0;
p^.name := '所有国家';
topnode := tv.Items.AddObject(nil, '所有国家', p);
topnode.SelectedIndex := 1; ds1.First;
while not ds1.Eof do
begin
New(p);
n := ds1.FieldByName('代码').AsInteger;
p^.name := ds1.FieldByName('国家').AsString;
p^.id := n;
node := tv.Items.AddChildObject(topnode, p^.name, p);
node.SelectedIndex := 1; LoadType(n, node);
ds1.Next;
end; ds1.Close;
ds1.Free;
end
else
begin
ds2 := TADOQuery.Create(Self);
ds2.Connection := Conn;
ds2.SQL.Text := ss;
ds2.Open; ds1.First;
while not ds2.Eof do
begin
New(p);
n := ds2.FieldByName('代码').AsInteger;
{此处,我觉得楼主的B表应该单独增加一个编号列作为主键,那样的话,n和p^.id应保存主键值而不是可重复的“代码”值}
p^.name := ds2.FieldByName('城市').AsString;
p^.id := n;
node := tv.Items.AddChildObject(topnode, p^.name, p);
node.SelectedIndex := 1; {LoadType(n, node);} {我本来的代码是多级类型递归生成,你的代码是两层,因此仓促间增加了一个ADOQuery,并增加条件语句的笨办法在同一个函数中实现,所以这个函数并不是一段好代码,呵呵}
ds2.Next;
end; ds2.Close;
ds2.Free;
end;
end;
在代码中有一句topnode.SelectedIndex := 1;和两句node.SelectedIndex := 1;都可以省去。
如果在树视图的属性中设置了图标,可以使用这三条语句,如果加上会出错的话,请删除它们。上面这个函数的调用方式是:
在需要刷新树视图时,调用 LoadType(0, nil);