数据库结构如下:地区名称Name和父地区名称PName(一个典型的树型结构)
****************************************************************
Name             PNameTIANJIN          N
TANGGU           TIANJIN
SHANGHAI         N
SHANDONG         N
JINAN            SHANGDONG
XINGANG          TANGGU
GUANGDONG        N
GUANGZHOU        GUANGDONG
DONGWAN          GUANGDONG
*****************************************************************Form1上有一个TreeView1,我想让窗体Form1建立的时候自动把数据里的内容生成树,并在TreeView1里显示出来.怎么写??????????????????????
还有如果Edit1.Text:='HANGU';      
        Edit2.Text:='TIANJIN'  怎么样选中TIANJIN选项,并在TIANJIN下面生成HANGU的子项???请把代码写完整谢谢!!!!!!!!!!

解决方案 »

  1.   

    怎样根据数据库的内容动态部门树 
    主要解答者: zswangII 提交人: dulei115 
    感谢: dulei115 
    审核者: l_xiaofeng 社区对应贴子: 查看 
    -----------------------------------
    数据库结构:  
    部门ID      部门名称    上级部门ID  
       1            总部门            -1  
       2            部门1                1  
       3            部门2                1  
       4            部门3                1  
       5            分部门1            2  
       6            分部门2            2  
       7            分部门3            2  
       8            子部门1            5  
       9            子部门1            5  
       。。  
    我想用递规的方法生成Treeview,程序如下:  
    PROCEDURE    newtreeview(部门ID,部门名称)  
    Begin  
    //Treeview1添加部门名称;  
    //Treeview1添加附带数据部门ID  
    ADOQuery1.close;  
    ADOQuery1.SQL.clear;  
    ADOQuery1.SQL.Text:=select  *  from  部门表  where  上级部门ID='+inttostr(部门ID)  
    ADOQuery1.open;  
    If          ADOQuery1..recordcount>0          then  
             Begin  
                 //Treeview1准备添加子节点  
                 ADOQuery1.First;  
                 For      i:=o  to      ADOQuery1.recordcount      do  
                         Begin  
                         Newtreeview(ADOQuery1.FieldByName(‘ID’),  
                                                 ADOQuery1.FieldByName(‘部门名称’))  
                         ADOQuery1.next;  
                         End;  
             End;  
    //Treeview如果有上层节点,则回到上层节点  
    End;  
    要求:当输入(1,总部门)时生成树为  
    总部门  
         部门1  
               分部门1  
                     子部门1  
                     子部门2  
               分部门2  
               分部门3  
         部门2  
         部门3  
           
    当输入(2,部门1)时生成树为  
    部门1  
         分部门1  
               子部门1  
               子部门2  
         分部门2  
         分部门3  
    (即生成自己部门和下属部门,且各名称附带数据为其ID号)  
    ---------------------------------------------------------------  
    PROCEDURE    TForm1.newtreeview(Node:TTreeNode;ID,Name:String);  
    var  
       tmpNode  :  TTreeNode;  
       ADOquery1  :  TADOQuery;  
    Begin  
       tmpNode  :=  TreeView1.Items.AddChild(Node,Name);  
       ADOQuery1  :=  TADOQuery.Create(self);  
       ADOQuery1.Connection  :=  ADOConnection1;  
       ADOQuery1.close;  
       ADOQuery1.SQL.clear;  
       ADOQuery1.SQL.Text  :=  'select  *  from  部门表  where  上级部门ID='+ID;  
       ADOQuery1.open;  
       If  ADOQuery1.recordcount  >  0    then  
       Begin  
           ADOQuery1.First;  
           while  not  ADOQuery1.Eof  do  
           Begin  
               Newtreeview(tmpNode,ADOQuery1.FieldByName('ID').AsString,  
                                       ADOQuery1.FieldByName('部门名称').AsString);  
               ADOQuery1.next;  
           End;  
       End;  
    End;  
    ---------------------------------------------------------------  
    (*//  
    标题:数据集处理成可视树  
    说明:处理父节点标识字段、节点文本字段、节点标识字段这种表结构  
    设计:Zswang  
    日期:2002-05-20  
    支持:[email protected]  
    //*)  
    ///////Begin  Source  
    function  DataSetToTreeNode(mDataSet:  TDataSet;  
       mFieldNameParent:  string;  //父节点标识字段名  
       mFieldNameTreeText:  string;  //节点文本字段名  
       mFieldNameTreeId:  string;  //节点标识字段名  
       mTreeView:  TTreeView;  mTreeNode:  TTreeNode;  
       mParentText:  string):  Boolean;  
    var  
       vTreeNode:  TTreeNode;  
       vFieldValues:  Variant;  
       vFieldNames:  string;  
    begin  
       Result  :=  False;  
       if  not  Assigned(mDataSet)  then  Exit;  
       if  not  Assigned(mTreeView)  then  Exit;  
       if  not  mDataSet.Active  then  Exit;  
       vFieldNames  :=  Format('%s;%s;%s',  
           [mFieldNameParent,  mFieldNameTreeText,  mFieldNameTreeId]);  
       mDataSet.Filtered  :=  False;  
       mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);  
       mDataSet.Filtered  :=  True;  
       if  mDataSet.RecordCount  =  0  then  Exit;  
       mDataSet.First;  
       while  not  mDataSet.Eof  do  begin  
           vTreeNode  :=  mTreeView.Items.AddChild(mTreeNode,  
               mDataSet.FieldByName(mFieldNameTreeText).AsString);  
           vFieldValues  :=  mDataSet[vFieldNames];  
           DataSetToTreeNode(mDataSet,  mFieldNameParent,  mFieldNameTreeText,  
               mFieldNameTreeId,  mTreeView,  vTreeNode,  
               mDataSet.FieldByName(mFieldNameTreeId).AsString);  
           ///////Begin  恢复位置  
           mDataSet.Filtered  :=  False;  
           mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);  
           mDataSet.Filtered  :=  True;  
           mDataSet.Locate(vFieldNames,  vFieldValues,  []);  
           ///////End  恢复位置  
           mDataSet.Next;  
       end;  
       Result  :=  True;  
    end;  
    ///////End  Source  
    ///////Begin  Demo  
    procedure  TForm1.Button1Click(Sender:  TObject);  
    begin  
       TreeView1.Items.Clear;  
       DataSetToTreeNode(Table1,  'ParentTreeId',  'TreeText',  'TreeId',  
           TreeView1,  nil,  'NULL');  
    end;  
    ///////End  Source  
    //---------------------------------------------------------------------------  
    //Borland  C++  Builder  
    //---------------------------------------------------------------------------  
    ///////Begin  Source  
    bool  DataSetToTreeNode(TDataSet*  mDataSet,  
       AnsiString  mFieldNameParent,  //父节点标识字段名  
       AnsiString  mFieldNameTreeText,  //节点文本字段名  
       AnsiString  mFieldNameTreeId,  //节点标识字段名  
       TTreeView*  mTreeView,  TTreeNode*  mTreeNode,  
       AnsiString  mParentText)  
    {  
       TTreeNode*  vTreeNode;  
       Variant  vFieldValues;  
       AnsiString  vFieldNames;  
       if  (mDataSet  ==  NULL)  return  false;  
       if  (mTreeView  ==  NULL)  return  false;  
       if  (!mDataSet->Active)  return  false;  
       vFieldNames  =  Format("%s;%s;%s",  
           ARRAYOFCONST((mFieldNameParent,  mFieldNameTreeText,  mFieldNameTreeId)));  
       mDataSet->Filtered  =  false;  
       mDataSet->Filter  =  Format("%s=%s",  ARRAYOFCONST((mFieldNameParent,  QuotedStr(mParentText))));  
       mDataSet->Filtered  =  true;  
       if  (mDataSet->IsEmpty())  return  false;  
       mDataSet->First();  
       while  (!mDataSet->Eof)  {  
           vTreeNode  =  mTreeView->Items->AddChild(mTreeNode,  
               mDataSet->FieldByName(mFieldNameTreeText)->AsString);  
           vFieldValues  =  mDataSet->FieldValues[vFieldNames];  
           DataSetToTreeNode(mDataSet,  mFieldNameParent,  mFieldNameTreeText,  
               mFieldNameTreeId,  mTreeView,  vTreeNode,  
               mDataSet->FieldByName(mFieldNameTreeId)->AsString);  
           ///////Begin  恢复位置  
           mDataSet->Filtered  =  false;  
           mDataSet->Filter  =  Format("%s=%s",  ARRAYOFCONST((mFieldNameParent,  QuotedStr(mParentText))));  
           mDataSet->Filtered  =  true;  
           mDataSet->Locate(vFieldNames,  vFieldValues,  TLocateOptions());  
           ///////End  恢复位置  
           mDataSet->Next();  
       };  
       return  true;  
    }  /*  DataSetToTreeNode  */  
    ///////End  Source  
    ///////Begin  Demo  
    void  __fastcall  TForm1::Button1Click(TObject  *Sender)  
    {  
       TreeView1->Items->Clear();  
       DataSetToTreeNode(Table1,  "UpperTreeId",  "TreeName",  "TreeId",  
           TreeView1,  NULL,  "NULL");  
    }  
    ///////End  Demo  
     
    //当前如下调用~~  
     
    begin  
       TreeView1.Items.Clear;  
       DataSetToTreeNode(ADOTable1,  '上级部门ID',  '部门名称',  '部门ID',  
           TreeView1,  nil,  '-1');  
       ADOTable1.Filter  :=  '';    
    end;  
      

  2.   

    jinjazz(近身剪(N-P攻略)) 别那么省事,我看了半天我没看懂.!!!!!!!!!!请帮帮我好吗,一个初学者!郁闷中........................................
      

  3.   

    这么完整的例子..唉...用一ADOTable1连接你的数据库表,加入下面代码(都是上面的!!)就可以了function  DataSetToTreeNode(mDataSet:  TDataSet;
       mFieldNameParent:  string;  //父节点标识字段名
       mFieldNameTreeText:  string;  //节点文本字段名
       mFieldNameTreeId:  string;  //节点标识字段名
       mTreeView:  TTreeView;  mTreeNode:  TTreeNode;  
       mParentText:  string):  Boolean;
    var
       vTreeNode:  TTreeNode;
       vFieldValues:  Variant;
       vFieldNames:  string;
    begin
       Result  :=  False;
       if  not  Assigned(mDataSet)  then  Exit;
       if  not  Assigned(mTreeView)  then  Exit;  
       if  not  mDataSet.Active  then  Exit;
       vFieldNames  :=  Format('%s;%s;%s',
           [mFieldNameParent,  mFieldNameTreeText,  mFieldNameTreeId]);
       mDataSet.Filtered  :=  False;
       mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);  
       mDataSet.Filtered  :=  True;
       if  mDataSet.RecordCount  =  0  then  Exit;
       mDataSet.First;
       while  not  mDataSet.Eof  do  begin
           vTreeNode  :=  mTreeView.Items.AddChild(mTreeNode,
               mDataSet.FieldByName(mFieldNameTreeText).AsString);
           vFieldValues  :=  mDataSet[vFieldNames];
           DataSetToTreeNode(mDataSet,  mFieldNameParent,  mFieldNameTreeText,
               mFieldNameTreeId,  mTreeView,  vTreeNode,
               mDataSet.FieldByName(mFieldNameTreeId).AsString);
           ///////Begin  恢复位置  
           mDataSet.Filtered  :=  False;
           mDataSet.Filter  :=  Format('%s=%s',  [mFieldNameParent,  QuotedStr(mParentText)]);
           mDataSet.Filtered  :=  True;
           mDataSet.Locate(vFieldNames,  vFieldValues,  []);  
           ///////End  恢复位置
           mDataSet.Next;
       end;
       Result  :=  True;  
    end;  
    ///////End  Source
    ///////Begin  Demo  
    procedure  TForm1.Button1Click(Sender:  TObject);
    begin
       TreeView1.Items.Clear;
       ADOTable1.Active:=false;
       ADOTable1.Active:=true;
       DataSetToTreeNode(ADOTable1,  'pname',  'name',  'name',
           TreeView1,  nil,  'N');
    end;
    ///////End  Source
      

  4.   

    Delphi Object and Component Reference
      Add, AddChild example
    The following example demonstrates how to add nodes and child nodes to a TTreeView control.procedure TForm1.Button1Click(Sender: TObject);var
      MyTreeNode1, MyTreeNode2: TTreeNode;
    begin
      with TreeView1.Items do
      begin
        Clear; { remove any existing nodes }
        MyTreeNode1 := Add(nil, 'RootTreeNode1'); { Add a root node }
        { Add a child node to the node just added }
        AddChild(MyTreeNode1,'ChildNode1');    {Add another root node}
        MyTreeNode2 := Add(MyTreeNode1, 'RootTreeNode2');
        {Give MyTreeNode2 to a child }
        AddChild(MyTreeNode2,'ChildNode2');    {Change MyTreeNode2 to ChildNode2 }
        { and add a child node to it}
        MyTreeNode2 := TreeView1.Items[3];
        AddChild(MyTreeNode2,'ChildNode2a');    {Add another child to ChildNode2, after ChildNode2a }
        Add(MyTreeNode2,'ChildNode2b');    {add another root node}
        Add(MyTreeNode1, 'RootTreeNode3');
      end;end;