我的程序中是重数据库中将数据表的名称调出,显示出来,如果想看该表中数据的详细记录,再将记录中name一栏展开到treeview的相应表下,在展开之前的初始化中,想做到先将该节点下的子节点内容删除,再展开。我现在是判断treeview.selected.haschildren 之后在展开。不只有没有别的好的方法,求教。
 -----表1
 |
 -----表2
 |
 -----表3-------name1
              |
              ---name2
              |
              ---name3

解决方案 »

  1.   

    参考:表结构
    create table pjtype
    (
    class int,    //树的层次
    hipjcod int,    //上一个节点id
    pjtype char(100), //该节点在treeview中显示的名称
    cnt int,    //该节点上所拥有对象数量
    typecod int primary key//该节点id
    )
    create unique index pjtype_idx on pjtype(class,hipjcod,pjtype){*********************
    删除配件类型(数据库中记录)
    *********************}
    procedure del_pjtype(in_int:integer);
    //删除当前项下所有类型
    var
      query:tquery;
    procedure del_pjtypechilditem(parent_int:integer);
    //递归调用删除子项
    var
      query:tquery;
    begin
      query:=tquery.Create(application);
      query.SQL.Clear;
      try
        with query do
        begin
          databaseName:='auto';
          sql.add('select pjtype,typecod,cnt from pjtype');
          sql.add('where hipjtype=:H_hipjtype');
          unprepare;
          prepare;
          ParamByName('H_hipjtype').asinteger:=parent_int;
          open;
          while not eof do
          begin
            if (fieldbyname('cnt').asinteger<>0) then
              raise Exception.Create(fields[0].asstring+'项下有汽配零件,删除失败!');
            del_pjtypechilditem(fields[1].asinteger);
            next;
          end;
          sql.clear;
          sql.add('delete from pjtype where typecod=:H_typecod ');
          unprepare;
          prepare;
          ParamByName('H_typecod').asinteger:=parent_int;
          ExecSQL;
        end;
      finally
        query.free;
      end;
    end;
    begin
      query:=tquery.Create(application);
      query.SQL.Clear;
      try
        with query do
        begin
          databaseName:='auto';
          sql.add('select pjtype,cnt from pjtype ');
          sql.add('where typecod=:H_typecod');
          unprepare;
          prepare;
          ParamByName('H_typecod').asinteger:=in_int;
          open;
          if (fields[1].AsInteger>0) then
            raise Exception.Create(fields[0].asstring+'项下有汽配零件,删除失败!');
          del_pjtypechilditem(in_int);
          sql.clear;
          sql.add('delete from pjtype where typecod=:H_typecod ');
          unprepare;
          prepare;
          ParamByName('H_typecod').asinteger:=in_int;
          ExecSQL;
        end;
      finally
        query.free;
      end;
    end;以下代码调用上面的过程
        try
          beginwork;
          del_pjtype(ppjdesc(tv_pjtype.selected.data)^.typecod);
          tv_pjtype.selected.Delete;
          if tv_pjtype.Items.Count=0 then
           begin
             b_newsub.Enabled:=false;
             b_del.Enabled:=false;
          end;
          Commit;
        except
          rollback;
          raise;
        end
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
    t:ttreenode;
    begin
    t:=treeview1.Selected;
    treeview1.items.Delete(t);
    end;end.
    不管怎么样只要选中的都删