在treeview控件中,我想删除一个节点,那么就要删除该节点下的所有子节点,这要用到递归,我数据库中的表结构如下:
ID  NAME  PARENT_ID
1   AAA   0
2   BBB   1
3   CCC   1
我在treeview中用指针存储了id,请问程序中怎么实现!急!!!!

解决方案 »

  1.   

    好象没有必要递归吧,非递归也不反对。
    procedure TForm1.Delete(node: TTreeNode);
    var
      T: TTreeNode;
    begin
      if node.HasChildren then
        begin
          t:= node.getFirstChild;
          delete(t);
        end;
      TreeView1.Items.Delete(node);
    end;
      

  2.   

    procedure TForm1.Delete(node: TTreeNode);
    var
      T: TTreeNode;
    begin
      while node.HasChildren do 
        begin
          t:= node.getFirstChild;
          delete(t);
        end;
      TreeView1.Items.Delete(node);
    end;
      

  3.   

    不递归的
    procedure Delete(node: TTreeNode);
    begin
      TreeView1.Items.Delete(node);
    end;
      

  4.   

    可以不用递归(当然用也是可以的):
    var
      ParentNode,CurrentNode: TTreeNode;
      L,C: Integer;
    begin
      //  ParentNode := ;
      if not ParentNode.HasChildren then Exit;
      C := 0;
      CurrentNode := ParentNode.GetNext;
      L := CurrentNode.Level;
      while L > ParentNode.Level do
      begin
        Inc(C);
        CurrentNode := ParentNode.GetNext;
        L := CurrentNode.Level;
      end;
      //删除数据库中ID为ParentNode.AbsoluteIndex到 ParentNode.AbsoluteIndex+C的记录
      ParentNode.Delete;
    end;————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  5.   

    删除时可不用递归
    创建树时可能用递归全局变量:
      delid:string //保存要删除的所有idprocedure deleteA(Node:TTreeNode);
    begin
      //删除树节点
      deleteNode(Node);
      //删除数据库纪录
      delid:='('+Copy(delid,1,Length(delid)-1)+')';
      With Tquery.Create(self) do
      begin
        DataBaseName:='XXXXXXXXXXXXXX'
        Sql.text:='delete from xxc where id in '+delid;
        ExecSql;
        free;
      end;
    end;
      
    procedure deleteNode(node: TTreeNode);
    var
      T: TTreeNode;
      p:^Integer;
    begin
      while node.HasChildren do 
      begin
          t:= node.getFirstChild;     
          deleteNode(t);              
      end;
      p:=Node.Data;
      delid:=delid+p^+','
      Dispose(p); 
      TreeView1.Items.Delete(node);
    end;不递归时根据TTreeNode.Level 纪录某一个节点下的所有子节点
    然后一次性删除
      

  6.   

    我不是说删除treeview啊,是删除数据库中的数据啊
      

  7.   

    procedure TForm1.Delete(node: TTreeNode);
    var
      T: TTreeNode;
      SQL: String;
      ID: string;
    begin
      ID:= TYourType(Node.Data).ID;
      SQL:= 'Delete from table where id ='+ID+' or PARENT_ID = '+ID;
      EXESQL(ADOQuery,SQL,True);
      if node.HasChildren then
        begin
          t:= node.getFirstChild;
          delete(t);
        end;
      TreeView1.Items.Delete(node);
    end;
      

  8.   

    虽然有很多接点,但是他们的PARENT_ID 是相同的。所以没有必要找到每一个。
      

  9.   

    hehaoliang(浩浩)(▲ ) ,你这个大……………………好人:
    我在上面不是告诉你:
    //删除数据库中ID为ParentNode.AbsoluteIndex到 ParentNode.AbsoluteIndex+C的记录,而C已经求出来了,用一个SQL语句就可以完成这些记录的删除了啊!!!————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  10.   

    to:hehaoliang(浩浩) 我真服了你了  
      

  11.   

    procedure TForm1.Delete(send:Object);
    begin
      NodeDelete(TreeView.Selected);end;procedure NodeDelete(Node: TTreeNode);
    var
      p_Node: TTreeNode;
      SQL: String;
      ID: string;
    begin
      while Node.HasChildren do
      begin
        p_Node := Node.GetFirstChild;
        if P_Node.HasChildRen then
          NodeDelete(p_Node);//递归    
        delete(P_Node); 
      end;
      
      ID:= TYourType(Node.Data).ID; 
      SQL:= 'Delete from table where ID = '''+ID+'''';
      EXESQL(ADOQuery,SQL,True);
    end;
      

  12.   

    //补充
    procedure TForm1.Delete(send:Object);
    begin
      NodeDelete(TreeView.Selected);
      treeView.Selected.delete;
    end;procedure NodeDelete(Node: TTreeNode);
    var
      p_Node: TTreeNode;
      SQL: String;
      ID: string;
    begin
      while Node.HasChildren do
      begin
        p_Node := Node.GetFirstChild;
        if P_Node.HasChildRen then
          NodeDelete(p_Node);//递归    
        delete(P_Node); 
      end;
      
      ID:= TYourType(Node.Data).ID; 
      SQL:= 'Delete from table where ID = '''+ID+'''';
      EXESQL(ADOQuery,SQL,True);
    end;