我的数据库有2张表a表代码  国家
 1   中国
 2   美国
 3   韩国
================
b表城市  代码
北京   1
河南   1
江苏   1
关岛   2
华盛顿 2
旧金山 2
汉城   3
======================
不知道要怎么做才能做成treeview树状呢??谢谢大家了

解决方案 »

  1.   


    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;
      

  2.   

    上面代码中,倒数第19行(含空行)写错一个字符:ds1.First应为ds2.First;
    在代码中有一句topnode.SelectedIndex := 1;和两句node.SelectedIndex := 1;都可以省去。
    如果在树视图的属性中设置了图标,可以使用这三条语句,如果加上会出错的话,请删除它们。上面这个函数的调用方式是:
    在需要刷新树视图时,调用 LoadType(0, nil);