对treeview不熟悉,希望大家帮帮忙。
比如现在sql数据库内有两张表,第一张是省份列表,第二张是市列表。
省列表内有两个字段provid、provname,市列表内也有两个字段cityid、cityname。
现在我想用treeview把上边两张表联系起来做个省市的树型结构。
代码应该怎样写,提供思路方法也可以。

解决方案 »

  1.   


    没说清楚
    比如
    省份列表内 广东的id是44
    市列表内的 广州的id是4401
      

  2.   

    你这个固定为两层不用递归,用循环可以做到:var
      quer1:TQuery;
      quer2:TQuery;
      tmnode:Treenode;
    begin
      quer1:=TQuery.create(self);
      quer2:=TQuery.create(self);
      with quer1 do
      begin
        close;
        sql.add('select provid、provname from 省表 ');
        open;
        while not quer1.eof do
        begin
          tmnode:=treeview1.Items.AddChild(nil,FieldByName('provname ').Asstring);
          with quer2 do
          begin
            close;
            sql.add(select cityname from 市表 where substring(cityid,1,2)=:nn);
            parameters[0].vale=quer1.FieldByName('provid').value;
            open;
            while not quer2.eof do
            begin
              treeview1.Items.AddChild(tmnode,FieldByName('cityname').Asstring);
              next;
            end;
          end;
        end;
       quer1.next;
      end;
    end;随手写的,未经调试,但意思很清楚了
      

  3.   

    如上可以把省表里的所有身份全部加载到树上,当然相应的市就在省的下面;如果要要让省份可选的话就在quer1传参数.
      

  4.   

    sql.add(select cityname from 市表 where substring(cityid,1,2)=:nn);
    后面那个 =:nn 是什么意思呢?
      

  5.   

    传一个参数啊,就是把对应的省份的provid传进去.
      

  6.   

    原理是这样的,先对省表进行循环,假设省表第一条记录是四川省,那就创建一个根节点节点的TEXT是'四川省',然后再把四川省的ID传进quer2,把市表里cityid字段前两位与四川省的ID相同的记录找出来,循环添加四川省的子节点,然后在移到省表第二条记录
      

  7.   

    呵呵,忘了写连接字串:
    connection:=adoconnection1;
    或者设置ConnectionString
      

  8.   

    这个我看明白了,但是调试过后再运行
    它说我的这个exe raised exception class EDBEngineError with message 'Table does not exist.
    File or directory does not exist.
    然后是
    路径\province.db      //路径是这个project的路径,province是那个省表表名
    路径\province.dbf
    路径\province.txt
    路径\province`. Porcess stopped. Use Step or Run to continue.是不是我没有指定好数据库或者数据源,所以它没找到啊?
    但是在dataname那个属性里我找不到province所在的那个数据库啊
      

  9.   

    表不存在,问题在于数据库连接不到;不好意思,由于是昨天晚上随手写的,有些问题,下面重新写一下
    首先,你的数据库用的是什么?我是当作在SQL下面写的:
    var
      quer1:TADOQuery;//针对省表的查询,只查询一次;
      quer2:TADOQuery;//针对市表的查询,次数为省表的记录数;
      tmnode:Treenode;//依据省表记录生成的省的根节点;
    begin
      quer1:=TADOQuery.create(self);
      quer2:=TADOQuery.create(self);
      quer1.connection:=ADOCONNECTION1;//设置好ADOCONNECTION1的数据库连接;
      quer2.connection:=ADOCONNECTION1
      with quer1 do  //针对省表进行循环;
      begin
        close;
        sql.clear;//这句应该加上;
        sql.add('select provid、provname from 省表 ');
        open;
        while not quer1.eof do //这里嵌套循环;
        begin
          tmnode:=treeview1.Items.AddChild(nil,FieldByName('provname ').Asstring);
          with quer2 do
          begin
            close;
            sql.clear;//这句应该加上;
            sql.add(select cityname from 市表 where substring(cityid,1,2)=:nn);
            parameters[0].vale=quer1.FieldByName('provid').value;
            open;
            while not quer2.eof do
            begin
              treeview1.Items.AddChild(tmnode,FieldByName('cityname').Asstring);
              next;
            end;
          end;
        end;
       quer1.next;
      end;
    end; 
      

  10.   

    sql.add(select cityname from 市表 where substring(cityid,1,2)=:nn);不明白上边这句啊
    右边的单引号加在哪啊?
      

  11.   

    sql.add('select cityname from 市表 where substring(cityid,1,2)=:nn');
      

  12.   

    sql.add('select cityname from 市表 where substring(cityid,1,2)=:nn');
      

  13.   

    sql.add(select cityname from 市表 where substring(cityid,1,2)=:nn);
    不明白上边这句啊
    ///////////////////////////////
    sql.add(select cityname from 市表 where 
    substring(cityid,1,2)//取cityid的前两位(从第“1”位开始,一次取“2”位)
    =:nn);//冒号加标识符(:nn)表示参数后面有给参数赋值的语句:
    parameters[0].vale=quer1.FieldByName('provid').value;//第一个参数赋值
    可以改为:parameters.parameterbyname('nn').vale=quer1.FieldByName;
    这样就清楚了吧。