小弟想做成这样一棵树,如果我想修改一个节点的代码或名称的话,则其子节点也要自动的修改举个例子:
(01)aaa
(0101)aaa.bbb
(0102)aaa.ccc
(010201)aaa.ccc.ddd
(02)eee
(0201)eee.fff
如果我想更改01节点的代码和名称,则其所有的子节点都会依次修改,或者说我修改0102,则010201也会跟随着修改,小弟知道要用递归的方法,但具体的过程小弟百思不得其解所以请教各位高手,小弟的树必须要这么做,不能更改。所以请各位高手指教!
(01)aaa
(0101)aaa.bbb
(0102)aaa.ccc
(010201)aaa.ccc.ddd
(02)eee
(0201)eee.fff
如果我想更改01节点的代码和名称,则其所有的子节点都会依次修改,或者说我修改0102,则010201也会跟随着修改,小弟知道要用递归的方法,但具体的过程小弟百思不得其解所以请教各位高手,小弟的树必须要这么做,不能更改。所以请各位高手指教!
解决方案 »
- dbgrid问题
- 简单问题,近来看看
- 点击查询按钮后,出现表,而且自动在表后加一个计算的列,怎么做?
- 这个网格的VCL叫什么名?(先线等待)
- DELPHI做的COM中,如何访问自己定义的类的CLSID和IID?谢谢!
- 经常听人说用delphi做前台,java做后台,中间用xml进行通讯.请问在delphi中用何种组件?
- 用ADO开发遇到的奇怪的问题!大家帮忙探讨一下!
- 两个Number型的字段相减后为什么会有哪么多小数位数?怎样使它只有两位小数?
- delphi7 控件上的&b的組合鍵為什么變成按單鍵了呢
- 运行时生成的组件如何调用?
- 一个关于treeview节点的修改的问题,怎样修改一个节点使其所有的子节点自动修改?
- 让DNGRID显示全部记录?
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;
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;
------------
(01)aaa
(0101)aaa.bbb
(0102)aaa.ccc
(010201)aaa.ccc.ddd
(02)eee
(0201)eee.fff
如果我想更改01节点的代码和名称,则其所有的子节点都会依次修改,或者说我修改0102,则010201也会跟随着修改
---------------
修改规则是什么?看你的代码是修改数据库中的数据,那应该可以查询后再修改。
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;
谢谢你,成功了。结贴!