从数据库取数据,形成treeview.如何设计数据库表的字段,及建树算法.有人能提供代码吗?谢谢

解决方案 »

  1.   

    id   name        parid01   管辖地区      0
    0101  城北区       01
    010101  街道1      0101
    0102   江南区       01
    010201  街道1       0102
    可以用递归了或者用Data指针的解决方法。   
    以下代码可以参考一下!用的是递归
    procedure CreateSubTree(FNodeName: string; Node: TTreeNode = nil);
    var
     mLocalName: string;
     TreeNode: TTreeNode;
     Ads_Tmp: TADODataSet;
    begin
     ADS_Tmp := TADODataSet.Create(Self);
     ADS_Tmp.Connection := ADOConn;
     with ADS_Tmp do
     begin
       Close;
       CommandText := 'Select * from Type Where ParID =' + FNodeName;
       Open;
       First;
       while not Eof do
       begin
         mLocalName := FieldbyName('ID').Asstring;
         TreeNode := TreeView.Items.AddChild(Node, FieldByName('Name').AsString);
         CreateSubTree(mLocalName, TreeNode); 
         Next;
       end;
     end;
    end; 
      

  2.   


    用下面的用递归:应该可以了!procedure TQueryF.getChildText(CurrentNode: TTreeNode);
    var
     i: integer;
    begin
     if CurrentNode.HasChildren = False then Exit;
     for i := 0 to CurrentNode.Count - 1 do
     begin
       ListBox1.items.add(CurrentNode.Item[i].Text);
       getChildText(CurrentNode.Item[i]);
     end;
    end;
      

  3.   

    自己写的一个,可以无限分级,不过效率很糟糕:(字段:
    id:integer(自增)
    name:varchar
    pid:integer...
    ...
    type
      PNode=^TNode;
      TNode=record
        id:integer;
      end;
    ...
    ...
    procedure CreateTree;
    var
      pn1:pnode;
      cnode:TTreeNode;
    begin
      TreeView1.Items.Clear;
      new(pn1);
      pn1.id:=0;
      cnode:=TreeView1.Items.AddChildObject(nil,'组织机构',pn1);
      with dm.Query1 do
      begin
        Close;
        Sql.Clear;
        Sql.Add('select id,name,pid from zzjg order by pid');
        Open;
        First;
        while not eof do
        begin
          new(pn1);
          pn1.id:=FieldByName('id').AsInteger;
          for i:=0 to TreeView1.Items.Count-1 do
          begin
            if pnode(TreeView1.Items.Item[i].Data).id=FieldByName('pid').AsInteger then
            begin
              cnode:=TreeView1.Items.AddChildObject(TreeView1.Items.Item[i],FieldByName('name').AsString,pn1);
             end;
          end;
          next;
        end;
      end;
    end;
      

  4.   

    我有个算发很不错,给我E_MAIL我给你发过去
      

  5.   

    楼上的算法能不能给偶发一个![email protected]
      

  6.   

    luckyboy97(幸运男孩) ,我的邮件是:[email protected]