请问,如何将下方查询出数据结构 显示成树形?就是如果一个节点有子类,就可点击+号扩展看到.....(可能是无限的子类,最基础的父类ID已定为0)高人帮看看,可否提供示例代码?谢了...
自动编号 部门名   父ID
-----------------------------
33 电脑部 37
34 行政部 36
35 工程部 38
36 生产部 39
37 货仓部 38
38 深圳公司 0
39 上海公司 0
40 北京公司 0
...

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Button1: TButton;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;type
      TRelateInfo = record
            id: integer;
            pid: integer;
    end;
    type PRelateInfo = ^TRelateInfo;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
            mTn: TTreeNode;
            mPrt: PRelateInfo;
            i,j: integer;
    begin
            AdoQuery1.Active := False;
            AdoQuery1.SQL.Text := 'SELECT * FROM test4 ORDER BY pid';
            AdoQuery1.Open;
            TreeView1.Items.Clear;
            //添加全部节点,暂无隶属关系
            while not AdoQuery1.Eof do
            begin
                    mTn := TreeView1.Items.AddChild(nil,AdoQuery1.FieldValues['dname']);
                    new(mPrt);
                    mPrt^.id := AdoQuery1.FieldValues['id'];
                    mPrt^.pid := AdoQuery1.FieldValues['pid'];
                    mTn.Data := mPrt;
                    AdoQuery1.Next;
            end;        //遍历全部节点,修改隶属关系
            i:=0;
            while i<TreeView1.Items.Count do
            begin
                    if PRelateInfo(TreeView1.Items.Item[i].Data)^.pid = 0 then
                    begin
                            Inc(i);
                            Continue;
                    end
                    else
                    begin
                            j:=0;
                            while j<TreeView1.Items.Count do
                            begin
                                    if j=i then
                                    begin
                                            Inc(j);
                                            Continue;
                                    end;
                                    if PRelateInfo(TreeView1.Items.Item[j].Data)^.id = PRelateInfo(TreeView1.Items.Item[i].Data)^.pid then
                                    begin
                                            TreeView1.Items.Item[i].MoveTo(TreeView1.Items.Item[j],naAddChild);
                                            break;
                                    end;
                                    Inc(j);
                            end;
                            if j=TreeView1.Items.Count then
                                    ShowMessage('非法数据:'+TreeView1.Items.Item[i].Text);
                            Inc(i);
                    end;
            end;
            //清空隶属关系变量,回收内存
            //如果后续程序需要利用该关系变量,可在from的onDestroy事件中释放
            for i:=0 to TreeView1.Items.Count -1 do
            begin
                    mTn := TreeView1.Items.Item[i];
                    mPrt := mTn.Data;
                    Dispose(mPrt);
                    mTn.Data := nil;
            end;
    end;end.
      

  2.   

    DBTreeView 可以搞定
    keyID=自动编号   displayfield=部门名   ParentID=父ID