比如我有个表table1  id name node
1  A     null
2  B     null
3  V     B
4  G     B
5  A1    A
6  A2    A
7  a3    A
8  K     NULL
现在我想把他显示在TREEVIEW上面
点写代码啊?各位告诉显示成
  A
    A1
    A2
    A3
  B
    V
    G
  K

解决方案 »

  1.   

    循环吧先筛选出 node=null的记录,然后添加到treeview,然后循环这几条记录,选出node=节点text的记录,再添加到treeview,依次类推建议
    第一次只筛选node=null的记录,然后在treeview的expanding事件中再查找属于他的子记录,类似于windows的资源管理器再有,数据库的设计建议如下id  pid  name  code(如果需要)pid为父级记录的id
      

  2.   

    这样应该行了,有点问题自己改改
    procedure TForm1.FindLeechDom(Leechdomname: String;node: TTreeNode);
    var
      temp: TQuery;
      node1: TTreeNode;
    begin
      Try
        temp := TQuery.Create(Self);
        temp.DatabaseName := ExtractFilePath(Application.ExeName);
        With temp do
        begin
          Close;
          SQL.Clear;
          SQL.Add('select * from table1 where node = :Value');
          ParamByName('value').AsString := id;
          Open;
        end;
        while Not Temp.Eof do
        begin
          node1 := TreeView1.Items.AddChild(node,temp.FieldByName('name').AsString);
          FindLeechDom(temp.FieldByName('name').AsString,node1);
          temp.Next;
        end;
      Finally
        temp.Free;
      end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var
      temp: TTreeNode;
    begin
        With Query1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add('select * from table1');
          Open;
        end;
        while not Query1.Eof do
        begin
          if Query1.FieldByName('node').AsString = '' then
          begin
            temp := TreeView1.Items.AddChild(TreeView1.Items[0],Query1.FieldByName('name').AsString);
            FindLeechDom(Query1.FieldByName('name').AsString,temp);
          end;
          Query1.Next;
        end;
    end;
      

  3.   

    定义 q 为数据集 q.clear; 
    q.sql.text := 'select * from table1 where code is null' 
    q.open; 
    while not q.eof do 
    begin 
      //名称添加到treeview(应该会吧) 
        q.Next; 
    end; 这样就选出了第一级节点 
    然后在treeview的expanding事件中 procedure TForm1.TreeView1Expanding(Sender: TObject; Node: TTreeNode; 
      var AllowExpansion: Boolean); 
    begin 
      q.close; 
      q.sql.text := 'select * from table1 where code='+QuotedStr(NOde.Text); 
      q.open; 
      while not q.eof do 
      begin 
        //名称添加到Node的自节点(应该会吧) 
        q.Next; 
      end; 
    end;
      

  4.   

    fyiprocedure TRES_BOM_VIEW_F.btnSB_SearchClick(Sender: TObject);//點擊按鈕生成樹的過程
    begin
      inherited;
      try
        RES_LOADING_F:=TRES_LOADING_F.Create(Self);
        RES_LOADING_F.Label1.Caption:='正在檢索相關數據......';
        RES_LOADING_F.Show;
        RES_LOADING_F.Update;
        CREATETREEVIEWMODEL;//過程名
      finally
        RES_LOADING_F.Close;
      end;
    end;procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
    var
      iLoop:Integer;
      Master,MasterNode:TTreeNode;
    begin
      adoq_getop.Close;
      //SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
      adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
      adoq_getop.Open;
      adoq_getop.First;
      cx_TV.Items.BeginUpdate;
      cx_TV.Items.Clear;
      Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
      while not adoq_getop.Eof do
      begin
        if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
        begin
          Screen.Cursor:=crSQLWait;
          MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
          Application.ProcessMessages;
          qry_op.Close;
          qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
          qry_op.Open;
          for iLoop:=0 to qry_op.RecordCount -1 do
          begin
            cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
            qry_op.Next;
          end;
          Application.ProcessMessages;
          cx_TV.Items.EndUpdate;
          Screen.Cursor:=crDefault;
        end;
        adoq_getop.Next;
        Application.ProcessMessages;
      end;
     {
      ThreadTView:=cx_TV;
      ViewThread:=TExpandLH.Create;
      ViewThread.Resume;
      }
    end;多層可用遞歸生成:
    private
        procedure CreateTreeModel;
        procedure CreateSubTree(isR:boolean;FNodeName:string;Node:TTreeNode=nil);
     { Private declarations }procedure TForm1.CreateTreeModel;
    var
      iLoop:Integer;
      aa:TTreeNode;
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Text:='SELECT PARN_TYP FROM bom GROUP BY PARN_TYP';
      ADOQuery1.Open;
      ADOQuery1.First;
      TreeView1.Items.BeginUpdate;
      TreeView1.Items.Clear;
      aa:=TreeView1.Items.Add(nil,'BOM');
      Screen.Cursor:=crSQLWait;
      Application.ProcessMessages;
      for iLoop:=0 to ADOQuery1.RecordCount -1 do
      begin
        TreeView1.Items.AddChild(aa,VarToStr(ADOQuery1.FieldValues['PARN_TYP']));
        ADOQuery1.Next;
      end;
      Application.ProcessMessages;
      TreeView1.Items.EndUpdate;
      TreeView1.Items[0].Expand(False);
      Screen.Cursor:=crDefault;
    end;procedure TForm1.CreateSubTree(isR:boolean;FNodeName:string;Node:TTreeNode=nil);
    var
      mLocalName:string;
      TreeNode:TTreeNode;
      Ads_Tmp,adoq_op:TADODataSet;
    begin
        if isR then
        begin
          Ads_Tmp:=TADODataSet.Create(Self);
          Ads_Tmp.Connection:=ADOConnection1;
          with Ads_Tmp do
          try
            Close;
            //CommandText:='Select distinct PARN_LITM from bom Where PARN_TYP ='+'''' + FNodeName+'''';
            CommandText:='Select distinct PARN_LITM from bom Where PARN_TYP ='+'''' + FNodeName+''' and PARN_LITM like ''3%''';
            Open;
            First;
            TreeView1.Items.BeginUpdate;
            Screen.Cursor:=crSQLWait;
            Application.ProcessMessages;
             while not Eof do
             begin
               mLocalName:=Trim(FieldbyName('PARN_LITM').Asstring);
               TreeNode:=TreeView1.Items.AddChild(Node,Trim(FieldByName('PARN_LITM').AsString));
               CreateSubTree(False,mLocalName,TreeNode);
               Next;
             end;
             Application.ProcessMessages;
             TreeView1.Items.EndUpdate;
             Screen.Cursor:=crDefault;
            finally
              Ads_Tmp.Free;
            end;
          end
          else
          begin
              adoq_op:=TADODataSet.Create(Self);
              adoq_op.Connection:=ADOConnection1;
              with adoq_op do
              try
                Close;
                CommandText:='Select CHLD_LITM from bom Where PARN_TYP='+''''+sTmp+''''+' and  PARN_LITM ='+'''' + FNodeName+''''+' group by CHLD_LITM';
                Open;
                First;
                TreeView1.Items.BeginUpdate;
                Screen.Cursor:=crSQLWait;
                Application.ProcessMessages;
                while not Eof do
                 begin
                   mLocalName:=Trim(FieldbyName('CHLD_LITM').Asstring);
                   TreeNode:=TreeView1.Items.AddChild(Node, Trim(FieldByName('CHLD_LITM').AsString));
                   CreateSubTree(False,mLocalName,TreeNode);
                   Next;
                 end;
                 Application.ProcessMessages;
                 TreeView1.Items.EndUpdate;
                 Screen.Cursor:=crDefault;
                finally
                  adoq_op.Free;
                end;
          end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      sTmp:=TreeView1.Selected.Text;
      CreateSubTree(True,TreeView1.Selected.Text,TreeView1.Selected);
    end;
      

  5.   

    procedure InitTree(Tree:TTreeView); 
    var 
      Root:TTreeNode; 
      RootQy:Tadoquery; 
      procedure CreateChild(node:TTreeNode;nodeName:string); 
      var 
        tempNode:TTreeNode; 
        tempQy:Tadoquery; 
      begin 
        tempQy:=Tadoquery.create(application); 
        tempQy.Connection:=ADOConnection1; 
        tempQy.SQL.Text:='select * from 表 where Node <>null and node='''+nodeName+''''; 
        tempQy.Open; 
        while not tempQy.Eof do 
        begin 
          tempNode:=Tree.Items.AddChild(node,tempQy.FieldValues['Name']); 
          CreateChild(tempNode,tempQy.FieldValues['Name']); 
        end; 
      end; 
    begin 
      RootQy:=Tadoquery.create(application); 
      RootQy.Connection:=ADOConnection1; 
      RootQy.SQL.Text:='select * from 表 where Node=null'; 
      Rootqy.Open; 
      while not Rootqy.Eof do 
      begin 
        Root:=Tree.Items.AddFirst(nil,Rootqy.FieldValues['name']); 
        CreateChild(Root,Rootqy.FieldValues['name']); 
        Rootqy.Next; 
      end; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      InitTree(TreeView1); 
    end;