我做一个通讯录!
在treeview的里,可以建立“分类”就是可以允许建立无限个子目录,但是这个表不知道该怎么做!
我用的是access,做了一个表,如下:
ID(自动编号)  名称    所属ID
1               八中     0
2               20中     0
3               1班      1
4               4班      2
5               同事     0
6              宏帮公司  5
7              开发组    6
----------------------------------“0”代表根,“1”代表属于id=1的子目录
大概Tree样子是
+八中 
     -1班+20中
     -4班+同事 
     +宏帮公司 
              -开发组这个在程序初始化的时候,我怎么才能将数据都表示在treeview里??
我刚开始学这个请高手帮帮我!

解决方案 »

  1.   

    使用ADOQuery查询出记录再添加到树中,:
    var
     TreeNode:TTreeNode;
    ...
    ADOQuery.sql.add('select * from yourtablename');
    ADOQuery.active:=true;
    ADOQuery.Recordset.movefirst;
    while not ((ADOQuery.Recordset.eof) and (ADOQuery.Recordset.bof)) do
    begin
     if ADOQuery1.Recordset.Fields.Item[2]=0 then
      TreeNode:=TreeView1.Items.Add(nil,ADOQuery1.Recordset.Fields.Item[1]);
     ....//其余的类似
     ADOQuery.Recordset.movenext;
    end;
    上面代码是临时写的,只是一个思想可能有错,你可以参考一下
      

  2.   

    不好意思上面的ADOQuery1.Recordset.Fields.Item[x]要改为ADOQuery1.Recordset.Fields.Item[x].value
      

  3.   

    TO hkbarton(宁静至远||淡泊明志) :那个子接点没办法找到根接点啊!
      

  4.   

    有控件:1stclass中的FCDBtreeview可以实现。
      

  5.   

    你可以先将第一级和第二级的记录先显示在treeview上,并将每个记录的ID绑定在treenode的data指针上,然后,在展开结点的时候,在取出这个ID去检索他的下级.
      

  6.   

    to mylovezcp
    这样写好象有点不友好
      

  7.   

    呵呵。。那有全部列入treeview的方法吗??
      

  8.   

    procedure TABCDM.WriteTotreeviewHy(treename: Ttreeview);
    var 
       Fathernode:Ttreenode;
    begin
      str_sql:='select ID,name from tanle1 where ...';
      run_query_sql(adoqry,str_sql);
      fa_gname:=adoqry.fieldbyname('name').asstring;
      treename.Items.Clear;
      Fathernode:=treename.Items.add(nil,fa_gname);
      while not adoqry.Eof do
      begin
         //查询子节点,并把字段赋值给Atype。略。
         treename.Items.addchild(Fathernode,Atype);
         adoqry.next;
      end;
    end;
      

  9.   

    TO  soaringsouth(栈桥捉鳖) 
    谢谢:
    这好象是个2层的,那子节点的子节点怎么办
      

  10.   

    无限树型.看看罗,我调试通过了!
    先定义
        PNodeInfo=^TNodeInfo;    //指针类型,存储对应节点信息
        TNodeInfo=Packed Record  
           NodeId:String;        //节点
           NodeName:string;      //节点名称
           ParentId:string;      //父节点
        end;定义函数procedure Tform.CreateTree(Id: integer;ParentNode:TTreeNode);
    var
        QryTmp:TSQLQuery;
        MyNode:TTreeNode;
        TmpNodeInfo:PNodeInfo;
    begin
        QryTmp:=TSQLQuery.Create(self);
        QryTmp.SQLConnection:=SQLConnection;
        QryTmp.SQL.Add('Select Nodeid,Parentid,Nodename From Policy_tree Where ParentId='+IntToStr(Id)+' Order by NodeId');
        QryTmp.Open;
        MyNode:=nil;
        while not QryTmp.Eof do
        begin
          New(TmpNodeInfo);
          TmpNodeInfo.Nodeid:=Trim(QryTmp.Fields[0].AsString);
          TmpNodeInfo.Parentid:=Trim(QryTmp.Fields[1].AsString);
          TmpNodeInfo.Nodename:=Trim(QryTmp.Fields[2].AsString);
          MyNode:=TView.Items.AddChildObject(ParentNode,QryTmp.Fields[2].AsString,TmpNodeInfo);  //把所有节点当作子节点遍历
          CreateTree(QryTmp.Fields[0].AsInteger,MyNode); //递归调用
          QryTmp.Next;
        end;
        QryTmp.Free;
    end;调用
         //显示树型
         CreateTree(0,nil);
      

  11.   

    TO : fsroger(fsroger)
    结点多的时候回很慢的,超过2000就不行
      

  12.   

    我也正碰到类似的问题,我也正寻求帮助,请大家看
    http://expert.csdn.net/Expert/topic/1919/1919940.xml?temp=.4958612
      

  13.   

    我在网上找到一个,没看懂,帮我分析分析
    -----------------------------------------
    树视图同数据库的关联
    awin.y365.com   Delphi梦工场 前 言 树形图用于显示按照树形结构进行组织的数据,其用途比较广泛,如计算机中的文件系统(Windows95中的资源管理器)、企业或公司的组成结构等。VB、PB、Delphi等工具提供了一个功能很强的树型控件TTreeView,可以用来描述复杂的层次关系。由于树形图结构较复杂,使用起来常不知如何下手。笔者结合电信综合统计管理系统中指标维护这一具体实例,详细阐述在Delphi下如何将树型控件的使用与数据库联系起来,实现数据分任意多层显示,方便地进行增加、修改、删除操作,而且用拖放技术实现各层数据之间的移动、复制。笔者希望通过对该实例的阐述,达到抛砖引玉的效果,与各位同仁相互交流,共同进步。 一、指标树的建立 具体方法是:创建一个数据库,设计指标表t_pub_index,包含index_id、parent_id、index_name字段,其它字段根据实际业务而定,指标名称index_name将在树型控件的节点上显示,index_id字段保存节点的唯一标识号,parent_id表示当前节点的父节点号,标识号组成了一个“链表”,记录了树上节点的结构。设计一窗体Frm_sys_index,其上放置TreeView控件tv_zb、Query控件Query1及其它指标属性编辑显示控件。一个树的节点又包含文本(Text)和数据(Data)。Text为String类,用来显示指标或指标目录名称。Data则为无定形指针(Untyped Pointer),可以指向一个与节点相联系的数据结构,该结构与数据库指标表相应域关联,如指标ID、上级节点ID。 Query控件的表达式为: select index_id, parent_id, index_name from t_pub_index start with index_id=0 connect by prior index_id=parent_id 其中start with 和connect by 是Oracle的SQL语句的保留字,使一条记录的parent_id列的值等于前一记录的index_id列的值,并以parent_id等于0的记录开始。 建树的基本思路是: procedure TFrm_sys_index.createtree; var curValue: indexPointer; //指向与节点相联系的数据结构的指针 curNode : TTreeNode; //当前节点 curid : integer; //当前节点标识号 begin curNode := nil; curid := -1; Query_index.Open; Query_index.first; while not Query_index.Eof do begin new(curValue); With curValue^ do 将数据库指标表t_pub_index各字段值赋curValue 所指数据结构 while(curid <> curValue.parent_id) do //当前节点的标识号不等于当前记录的父节点号 begin curNode := curNode.parent; curid:= indexPointer(curNode.data).index_id; end; curNode := tv_zb.Items.AddChildObject(curNode, curValue^.index_name,curValue); //在当前节点上添加子节点,显示节点指标名称,所带指针指向一个与指标数据相联系的数据结构 curid := indexPointer(curNode.data).index_id; Query_index.next; end; Query_index.close; end; 
      

  14.   

    我觉得你的表结构设计不太合理。我建议你建一个包含关系的表。这样在TREEVIEW中才好展开。我目前正在设计一个人事管理,我涉及了四级部门的管理。我也想用TREEVIEW来进行展开显示。
    但我的表中设计是包含部门级别的。例如你的上面可以修改成如下:
    ID(自动编号)  一级     二级     三级 
    1               八中     一班
    2               八中     二班
    3              20中     四班
    4              同事     宏帮公司 开发组
      

  15.   

    好像 fsroger(fsroger) 的方法最好了,我也是这样实现的。
      

  16.   

    to doghole(臭臭) :
    其实这个表是临时的,我可能要建立很多层,所以只能用这个表了