小弟想做成这样一棵树,如果我想修改一个节点的代码或名称的话,则其子节点也要自动的修改举个例子:
(01)aaa
  (0101)aaa.bbb
  (0102)aaa.ccc
       (010201)aaa.ccc.ddd
(02)eee
   (0201)eee.fff
如果我想更改01节点的代码和名称,则其所有的子节点都会依次修改,或者说我修改0102,则010201也会跟随着修改,小弟知道要用递归的方法,但具体的过程小弟百思不得其解所以请教各位高手,小弟的树必须要这么做,不能更改。所以请各位高手指教!

解决方案 »

  1.   

    我现在是在数据库中用父节点和节点的编号来判断要将节点放在什么位置的,现在要更改一个节点的编号,那也就以为着该节点的所有子节点的父节点也要更改了,而且子节点的编码是由父节点的编码和子节点自己的代码所组成,所以就需要完成多部分的更改,我现在做了一下,但只能更改要修改的节点,其他的子节点没有更改,也就是说我在过程中使用的循环没有效果,我觉得是我自己的想法有问题,所以来求救,希望大家能给个更好的方法。我把代码贴出来吧:
    procedure Tf_edituser.edittree;
    begin
      with dm_data.ClientDataSet_user do
      begin
       try
        First;
        repeat
          if AnsiStartsText(change_id,dm_data.ClientDataSet_user.Fields[0].AsString) then
          begin
            Edit;
            if Fields[3].AsString='nil' then
            begin
              fields[0].AsString:=dm_data.ClientDataSet_user.Fields[1].AsString;
            end
            else
            begin
              Fields[3].AsString:=userid.Text;
              fields[0].AsString:=userid.Text+dm_data.ClientDataSet_user.Fields[1].AsString;
            end;
            Applyupdates(0);
          end;
          dm_data.ClientDataSet_user.Next;
         Until dm_data.ClientDataSet_user.Eof;
         if AnsiStartsText(change_id,dm_data.ClientDataSet_user.Fields[0].AsString) then
         begin
           Edit;
           if Fields[3].AsString='nil' then
           begin
             fields[0].AsString:=dm_data.ClientDataSet_user.Fields[1].AsString;
           end
           else
           begin
            fields[3].AsString:=userid.Text;
            fields[0].AsString:=userid.Text+dm_data.ClientDataSet_user.Fields[1].AsString;
           end;
           Applyupdates(0);
         end;
        except
          showmessage('数据修改错误!');
        end;
      end;
    end;
      

  2.   

    小弟又做了一次,但还是不能实现将子节点全部改变,小弟将代码贴出来
    procedure Tf_edituser.edittree;
    begin
     try
       with dm_data.ClientDataSet_user do
       begin
         repeat
           if AnsiStartsText(treename,dm_data.ClientDataSet_user.Fields[0].AsString)then
           begin
             Edit;
             if Fields[3].AsString='nil' then
             begin
               Fields[0].AsString:=usernum.Text;
               Fields[1].AsString:=usernum.Text;
               Fields[2].AsString:=username.Text;
               Fields[5].AsString:=usertrue.Text;
               Fields[6].AsString:=userpassword.Text;
             end
             else
             begin
               Fields[0].AsString:=usernum.Text+Fields[1].AsString;
               Fields[3].AsString:=usernum.Text;
               Fields[4].AsString:=username.Text;
             end;
           end;
           Applyupdates(0);
           Next;
         until dm_data.ClientDataSet_user.Eof;
         if AnsiStartsText(treename,dm_data.ClientDataSet_user.Fields[0].AsString)then
           begin
             Edit;
             if Fields[3].AsString='nil' then
             begin
               Fields[0].AsString:=usernum.Text;
               Fields[1].AsString:=usernum.Text;
               Fields[2].AsString:=username.Text;
               Fields[5].AsString:=usertrue.Text;
               Fields[6].AsString:=userpassword.Text;
             end
             else
             begin
               Fields[0].AsString:=usernum.Text+Fields[1].AsString;
               Fields[3].AsString:=usernum.Text;
               Fields[4].AsString:=username.Text;
             end;
             Applyupdates(0);
          end;
       end;
      except
        showmessage('数据修改错误!');
      end;
    end;
      

  3.   

    不是让你用Update语句来做吗?你什么没用呀!
      

  4.   

    描述不清,代码没有一句注释,叫人怎么帮助你?
    ------------
    (01)aaa
      (0101)aaa.bbb
      (0102)aaa.ccc
           (010201)aaa.ccc.ddd
    (02)eee
       (0201)eee.fff
    如果我想更改01节点的代码和名称,则其所有的子节点都会依次修改,或者说我修改0102,则010201也会跟随着修改
    ---------------
    修改规则是什么?看你的代码是修改数据库中的数据,那应该可以查询后再修改。
      

  5.   

    procedure Tf_edituser.FormShow(Sender: TObject);
    var
      n:integer;
    begin
      treename:=f_power.tv_user.Selected.Text; //将所选节点的text赋给变量treename
      n:=pos(')',treename);   //将treename中“)”的位置赋给n
      treename:=copy(treename,2,(n-2));   //将treename字符串从第2位到第n-2位的值赋给treename变量
      with dm_data.ClientDataSet_user do
      begin
        Active:=false;
        {filter:='';    //不能过滤,出现错误,只能修改一条记录的编号
        Filter:='user_id='''+treename+'''';
        filtered:=true;}
        Active:=true;
      end;
    end;procedure Tf_edituser.Button2Click(Sender: TObject);
    begin
      self.Close;
    end;procedure Tf_edituser.Button1Click(Sender: TObject);
    begin
      self.edittree;  //调用修改节点的方法
      f_power.WriteText;  //重新调用建树函数
      self.Close;
    end;procedure Tf_edituser.edittree;
    begin
      try
      dm_data.ClientDataSet_user.First; //将记录指针提前到第1位
      repeat
        if AnsiSameStr(treename,dm_data.ClientDataSet_user.Fields[0].AsString) then //判断记录的编码是不是与
        begin
          with dm_data.ClientDataSet_user do
          begin
            Edit;
            Fieldbyname('user_id').AsString:=edit_id.Text;
            Fieldbyname('user_num').AsString:=edit_num.Text;
            Fieldbyname('user_name').AsString:=edit_name.Text;
            Fieldbyname('user_true').AsString:=edit_true.Text;
            Fieldbyname('user_password').AsString:=edit_password.Text;
            Applyupdates(0);
          end;
        end
        else if AnsiStartsStr(treename,dm_data.ClientDataSet_user.Fields[0].AsString) then
        begin
          with dm_data.ClientDataSet_user do
          begin
            Edit;
            Fieldbyname('parent_num').AsString:=edit_id.Text;
            Fieldbyname('parent_name').AsString:=edit_name.Text;
            Fieldbyname('user_id').AsString:=trim(edit_id.Text)+trim(dm_data.ClientDataSet_user.Fields[1].AsString);
            Applyupdates(0);
          end;
        end;
        dm_data.ClientDataSet_user.Next;
      Until dm_data.ClientDataSet_user.Eof;
      if AnsiSameStr(treename,dm_data.ClientDataSet_user.Fields[0].AsString) then
        begin
          with dm_data.ClientDataSet_user do
          begin
            Edit;
            Fieldbyname('user_id').AsString:=edit_id.Text;
            Fieldbyname('user_num').AsString:=edit_num.Text;
            Fieldbyname('user_name').AsString:=edit_name.Text;
            Applyupdates(0);
          end;
        end
      else if AnsiStartsStr(treename,dm_data.ClientDataSet_user.Fields[0].AsString) then
      begin
        with dm_data.ClientDataSet_user do
        begin
          Edit;
          Fieldbyname('parent_num').AsString:=edit_id.Text;
          Fieldbyname('parent_name').AsString:=edit_name.Text;
          Fieldbyname('user_id').AsString:=trim(edit_id.Text)+trim(dm_data.ClientDataSet_user.Fields[1].AsString);
          Applyupdates(0);
        end;
      end;
      dm_data.ClientDataSet_user.Active:=false;
      except
        showmessage('数据库提交错误!');
      end;
      

  6.   

    zsjzwj(北极熊)
    谢谢你,成功了。结贴!