比如我有个表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.   

    var
      tmpRoot: TTreeNode;
      function GetRoot(aNode: string): TTreeNode;
      var
        I: Integer;
      begin
        Result := nil;
        for I := 0 to TreeView1.Items.Count - 1 do    // Iterate
        begin
          if TreeView1.Items[i].Text = aNode then
          begin
            Result := TreeView1.Items[i];
            break;
          end;
        end;    // for
      end;
    begin
      //dxRibbon1.ColorSchemeName := 'MoneyTwins';
      ADOQuery2.SQL.Text := 'select * from users order by node';
      ADOQuery2.Open;
      ADOQuery2.Filter := ' Node = null';
      ADOQuery2.Filtered := True;
      ADOQuery2.First;
      while not ADOQuery2.Eof do
      begin
        TreeView1.Items.AddChild(nil, ADOQuery2.Fields[1].AsString) ;
        ADOQuery2.Next;
      end;    // while  ADOQuery2.Filter := ' Node <> null';
      ADOQuery2.Filtered := True;
      ADOQuery2.First;
      while not ADOQuery2.Eof do
      begin
        tmpRoot := GetRoot(ADOQuery2.Fields[2].AsString);
        if tmpRoot <> nil then
          TreeView1.Items.AddChild(tmpRoot, ADOQuery2.Fields[1].AsString) ;
        ADOQuery2.Next;  
      end;
      ADOQuery2.Close;
      

  2.   


    procedure SetDataToTV(Qry: TQuery);
    var
      vNodes: array of TTreeNode;
      vNd: TTreeNode;
      SL : TStringList;
      vi: integer; 
    begin
      with Qry do
      begin
        if active then active := False;
        SQL.Text := 'Select * from table1 order by node';
        open;
        SL := TStringList.Create;
        vi := 0;
        while not eof do
        begin
          if FieldByName('NODE').ISNull then//注意排序,先让所有父节点全部产生,
          begin 
            inc(vi);
            SetLength(vNodes,vi);
            vNode[vi-1]:=TreeView1.Items.Add(nil,FieldByName('Name').AsString);
            SL.Add(FieldByName('Name').AsString+'='+IntToStr(vi-1)); 
          end
          else 
          begin
            vND := vNodes[SL.Values[FieldByName('Node').AsString]]
            TreeView1.Items.AddChild(vNd,FieldByName('Name').AsString);
          end;
          next;
        end;
        SL.Free;
      end; 
    end;
      

  3.   


    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 leechdom.db where 上级编码 = :Value');
          ParamByName('value').AsString := Leechdomname;
          Open;
        end;
        while Not Temp.Eof do
        begin
          node1 := TreeView1.Items.AddChild(node,temp.FieldByName('药品类别').AsString);
          FindLeechDom(temp.FieldByName('药品类别').AsString,node1);
          temp.Next;
        end;
      Finally
        temp.Free;
      end;
    end;
    procedure TForm1.FormCreate(Sender: TObject);
    var
      temp: TTreeNode;
    begin
      if FileExists(ExtractFilePath(Application.ExeName)+'leechdom.db') then
      begin
        Query1.DatabaseName := ExtractFilePath(Application.ExeName);
        With Query1 do
        begin
          Close;
          SQL.Clear;
          SQL.Add('select * from leechdom.db');
          Open;
        end;
        while not Query1.Eof do
        begin
          if Query1.FieldByName('上级编码').AsString = '' then
          begin
            temp := TreeView1.Items.AddChild(TreeView1.Items[0],Query1.FieldByName('药品类别').AsString);
            FindLeechDom(Query1.FieldByName('药品类别').AsString,temp);
          end;
          Query1.Next;
        end;
      end;
    end;
      

  4.   

    生成TreeNode时,最好挂接一个结构体,这样以后扩展方便!