我的数据库内容为下
bmid     bmmc     fbmid
01       总部     
0101     一部     01
0102     二部     01
0103     三部     01
010101   一部一室 0101
010102   一部二室 0102
010201   二部一室 0201
010202   二部二室 0202数据库字段说明
bmid:部门序号
bmmc:部门名称
fbmid:上级部门序号上面的数据库我要显示在树形控件中,式样如下:
  总部
   |--一部
      |——一部一室
      |——一部二室
   |--二部
      |——二部一室
      |——二部二室
   |--三部请问这样的代码怎么写  

解决方案 »

  1.   

    這個很簡單,一般使用遞歸.
    delphi6+oracle9i  --不使用遞歸:
    //Add all NOdes ONce,and the pre_no of the root node must be '0' 
    procedure P_AddAllNode(TableName,KeyField,ParentField,DisplayField,PrarentFilter,RootName : string;TV : TTreeView);
    var
        Node,Node_tmp:TTreeNode;
        NodeText,NodeText_tmp:string;
        TV_tmp : TTreeView;
        Query : TADOQuery;
    begin
        Query:=TADOQuery.Create(nil);
        TV_tmp := TTreeView.Create(nil);
        TV_tmp.Parent := TV.Parent;
        TV_tmp.Visible := false;
        with Query do
        begin
            Connection := Pubconn;
            Close;
            SQL.Clear;
            SQL.Add('SELECT '+KeyField+','+ParentField+','+DisplayField+' from '+
                TableName+' START WITH '+PrarentFilter+' CONNECT BY '+
                ParentField+'=PRIOR '+KeyField);
            Open;
            TV.Items.Clear;
            TV_tmp.Items.Clear;
            Node:=TV.Items.Add(nil,'[0]'+RootName);//Add Root Node
            Node_tmp:=TV_tmp.Items.Add(nil,'');
            while not eof do
            begin
                NodeText:='['+FieldByName(KeyField).AsString+']'+FieldByName(DisplayField).AsString;
                NodeText_tmp:=FieldByName(ParentField).AsString;
                if (FieldByName(ParentField).AsString=GetNodeKey(Node)) then//Filiation
                begin
                    Node:=TV.Items.AddChild(Node,NodeText);
                    Node_tmp:=TV_tmp.Items.AddChild(Node_tmp,NodeText_tmp);
                end
                else
                    if (FieldByName(ParentField).AsString=Node_tmp.Text) then//Brother
                    begin
                        Node:=TV.Items.Add(Node,NodeText);
                        Node_tmp:=TV_tmp.Items.Add(Node_tmp,NodeText_tmp);
                    end
                    else begin //Not Direct Relation
                         while Node.Parent<>nil do
                         begin
                            Node:=Node.Parent;
                            Node_tmp:=Node_tmp.Parent;
                            if (FieldByName(ParentField).AsString=Node_tmp.Text) then
                            begin
                                Node:=TV.Items.Add(Node,NodeText);
                                Node_tmp:=TV_tmp.Items.Add(Node_tmp,NodeText_tmp);
                                Break;
                            end;
                         end;
                    end;
                Next;
            end;
            TV.Selected.Index
        end;
        Query.Close;
        Query.Free;
        TV_tmp.Free; 
    end;
      

  2.   

    function GetNodeKey(vNode: TTreeNode): string;
    begin
        Result:=copy(WideString(vNode.Text),2,pos(WideString(']'),WideString(vNode.Text))-2);
    end;節點的text形如:[節點id]節點名稱
      

  3.   

    为什么在DELPHI加载树形目录这么复杂,在VB中就是很简单!有什么简单的方法呢?