第一层节点能加上去
第二层节点总是加不上去
还提示: table read only
表结构:部门表:GRPID、GRPNAME
       员工表:CODE,NAME,GRPID添加第一层节点的代码:
procedure TFrm_KernelPurView.Button1Click(Sender: TObject);
var
  node : TTreeNode; i : integer;
  s : string;
begin
  inherited;
  with query1 do
  begin
    close;
    sql.Clear;
    sql.Add('SELECT GRPID,GRPNAME FROM SYSGROUP');
    open;
  end;
  s := query1.fieldbyname('grpname').AsString;
  treeview1.Items.Clear;
  for i := 0 to query1.RecordCount - 1 do
    begin
      treeview1.Items.Add(nil,s);
      next;
    end;
  treeview1.Items[0].HasChildren := true;
end;第二层:
procedure TFrm_KernelPurView.TreeView1Expanding(Sender: TObject;
  Node: TTreeNode; var AllowExpansion: Boolean);
var
  i : integer;
begin
  inherited;
  with query2 do
    begin
      close;
      sql.Clear;
      sql.Add('SELECT A.GRPNAME,B.NAME FROM SYSGROUP A,SYSUSER B WHERE A.GRPID = B.GRPID');
      open;
    end;
  for i := 0 to query2.RecordCount -1 do
    begin
      treeview1.Items.AddChild(node,query2.fieldbyname('name').AsString);
      next;
    end;
end;

解决方案 »

  1.   

    个人觉得可以不在扩展时才添加第二层节点,可以在刷新树视图或者声明某个方法
    来实现添加过程。以下是我的代码片断:procedure TfrmMainForm.AddChildFolderToTree(Node: TTreeNode);
    var
      i :integer;
      tmpNode :TTreeNode;
    begin
      ...
           tmpNode := TreeView.Items.AddChild(Node, tmpFolder.Name);
           tmpNode.Data := tmpFolder;
           tmpNode.ImageIndex := tmpFolder.ImageIndex;
           tmpNode.SelectedIndex := tmpFolder.SelectIndex;
           AddChildFolderToTree(tmpNode);
      ...
    end;
      

  2.   

    procedure TfrmStoreGl.FormCreate(Sender: TObject);
    var
      pCode, yCode, pName: string;
      MainNode, yNode, zNode,aNode,bNode,cNode,dNode,eNode,fNode,gNode,hNode,oNode: TTreeNode;
    begin
      MainNode := TTreeNode.Create(DqmlView.Items);
      yNode := TTreeNode.Create(DqmlView.Items);
      zNode := TTreeNode.Create(DqmlView.Items);
      DqmlView.Items.Clear;
      MainNode := DqmlView.Items.AddChild(nil, '所有仓库');
      oNode := MainNode;
      with ADOQuery_ml do
      begin
          Close;
          SQL.Clear;
          SQL.Text:='Select StoreID,StoreName From ESMStore order by StoreID ' ;
          Open;
      end;
      ADOQuery_ml.First;
      yCode := Trim(ADOQuery_ml.FieldByName('StoreID').AsString);
      DqmlView.Items.BeginUpdate;
      while not ADOQuery_ml.Eof do
      begin
          pCode := Trim(ADOQuery_ml.FieldByName('StoreID').AsString);
          pName := Trim(ADOQuery_ml.FieldByName('StoreName').AsString);
          case Length(pCode) of
          3:begin     //第一层
                MainNode := DqmlView.Items.AddChild(oNode, pCode + ' ' + pName);
                yNode := MainNode;
            end;
          6:begin //第二层
                pCode := Copy(pCode, 4, 3);
                MainNode := DqmlView.Items.AddChild(yNode, pCode + ' ' + pName);
                zNode := MainNode;
            end;
          9:begin  //第三层
                pCode := Copy(pCode, 7, 3);
                MainNode := DqmlView.Items.AddChild(zNode, pCode + ' ' + pName);
                aNode:=MainNode;
            end;
          12:begin //第四层
                pCode := Copy(pCode, 10, 3);
                MainNode := DqmlView.Items.AddChild(aNode, pCode + ' ' + pName);
                bNode:=MainNode;
             end;
          15:begin //第五层
                pCode := Copy(pCode, 13, 3);
                MainNode := DqmlView.Items.AddChild(bNode, pCode + ' ' + pName);
                cNode:=MainNode;
             end;
          18:begin //第六层
                pCode := Copy(pCode, 16, 3);
                MainNode := DqmlView.Items.AddChild(cNode, pCode + ' ' + pName);
                dNode:=MainNode;
             end;
          21:begin //第七层
                pCode := Copy(pCode, 19, 3);
                MainNode := DqmlView.Items.AddChild(dNode, pCode + ' ' + pName);
                eNode:=MainNode;
             end;
          24:begin //第八层
                pCode := Copy(pCode, 22, 3);
                MainNode := DqmlView.Items.AddChild(eNode, pCode + ' ' + pName);
                fNode:=MainNode;
             end;
          27:begin //第九层
                pCode := Copy(pCode, 25, 3);
                MainNode := DqmlView.Items.AddChild(fNode, pCode + ' ' + pName);
                gNode:=MainNode;
             end;
          30:begin //第十层
                pCode := Copy(pCode, 28, 3);
                MainNode := DqmlView.Items.AddChild(gNode, pCode + ' ' + pName);
                hNode:=MainNode;
             end;
          end;
          Mainnode.SelectedIndex := 16;
          Mainnode.ImageIndex := 17;
          ADOQuery_ml.Next;
      end;
      DqmlView.Items.EndUpdate;
      if DqmlView.Items.Count > 1 then
        begin
          DqmlView.Items[0].Item[0].Selected := True;
          DqmlView.OnClick(Sender);
        end
      else
        begin
          DqtjaddButton.Enabled := False;
          DqDeleteButton.Enabled := False;
        end;
        
      pClearEdit;//清空数据
      BitBtnsave.Enabled:=False;
      BitBtn1.Enabled:=False;
      Panel3.Enabled:=False;
    end;
      

  3.   

    treeview1.Items.AddChild(node,query2.fieldbyname('name').AsString);
    ->
    treeview1.Items[0].AddChild(node,query2.fieldbyname('name').AsString);
      

  4.   

    {procedure TMainFrm.DataToTree;
    var
      Root ,pNode , cNode : TTreeNode;
      pPoint :  Pdepartment;
      vIndex : Integer;
    begin
      //
      TreeView1.Items.Clear;
      Root := TreeView1.Items.AddFirst(Nil,FUnitName);
      OpenDataSet('0');
      pNode := Root;
      ComboBox1.Clear;
      if DataModuleFrm.TempADOQuery.RecordCount <> 0 then
      begin
        while Not DataModuleFrm.TempADOQuery.Eof do
        begin
          New(pPoint);
          pPoint.Name := DataModuleFrm.TempADOQuery.FieldByName('department_Name').AsString;
          pPoint.Code := DataModuleFrm.TempADOQuery.FieldByName('Department_Code').AsString;
          cNode := TreeView1.Items.AddChild(pNode ,pPoint.Name);
          cNode.Data := pPoint;
          DataModuleFrm.TempADOQuery.Next;
          ComboBox1.Items.Add(pPoint.Name);
        end;
      end;  if TreeView1.Items.Count <> 1 then
      begin
        pNode := Root.getFirstChild;
        for vIndex :=  0 to Root.Count do
        begin
          OpenDataSet(pdepartment(pNode.Data).Code);
          if DataModuleFrm.TempADOQuery.RecordCount <> 0 then
          begin
            while Not DataModuleFrm.TempADOQuery.Eof do
            begin
              New(pPoint);
              pPoint.Name := DataModuleFrm.TempADOQuery.FieldByName('department_Name').AsString;
              pPoint.Code := DataModuleFrm.TempADOQuery.FieldByName('Department_Code').AsString;
              cNode := TreeView1.Items.AddChild(pNode,pPoint.Name);
              cNode.Data := pPoint;
              DataModuleFrm.TempADOQuery.Next;
            end;
            pNode := PNode.getNextSibling;
            if pNode = Nil then
              Exit;
          end;
        end;
      end;end;}以前写的。
      

  5.   

    一次全添加进去:procedure TFrm_KernelPurView.Button1Click(Sender: TObject);
    var
      node : TTreeNode;
      i : integer;
      s : string;
    begin
      inherited;
      with query1 do
      begin
        close;
        sql.Clear;
        sql.Add('SELECT GRPID,GRPNAME FROM SYSGROUP');
        open;
      end;
      s := query1.fieldbyname('grpname').AsString;
      treeview1.Items.Clear;
      for i := 0 to query1.RecordCount - 1 do
        begin
          Node := treeview1.Items.Add(nil,s);
          with query2 do
          begin
            close;
            sql.Clear;
            sql.Add('SELECT A.GRPNAME,B.NAME FROM SYSGROUP A,SYSUSER B WHERE A.GRPID = B.GRPID');
            open;
          end;
          for i := 0 to query2.RecordCount -1 do
          begin
            treeview1.Items.AddChild(node,query2.fieldbyname('name').AsString);
            next;
          end;
          next;
        end;end;