X
xj_zh
Unregistered / Unconfirmed
GUEST, unregistred user!
最近做一个程序,dxDBTreeList控件,根据数据库中的信息自动生成树状信息。<br>现在想在选中一个结点时,删除以其为根的子树。<br>使用中发现,若使用dxDBTreeList自身提供的删除结点、删除子树功能(DeleteChildren),在保存后,数据仍然存在。也就是说数据并未真正从dataset中删除。(可能是我配置不当)<br>于是我使用了一些方法,直接根据选中的结点信息,操纵dataset,但这些方法确碰到了一个问题。请各位给予帮忙。(代码如下)<br>删除按钮代码:<br>procedure Tfrm_ModelEdit.cb_delClick(Sender: TObject);<br>var<br>TempNode, LastNode: TdxTreeListNode;<br>begin<br>//得到讲删除的子树的最后一个结点<br>LastNode := dxDBTreeList2.FocusedNode;<br>if dxDBTreeList2.FocusedNode.GetNextSibling <> nil then<br>LastNode := dxDBTreeList2.FocusedNode.GetNextSibling.GetPriorNode<br>else<br>while LastNode.GetNextNode <> nil do<br>LastNode := LastNode.GetNextNode;<br><br>TempNode := dxDBTreeList2.FocusedNode;<br><br><br>//讲要删除的结点的“指标值”一栏置为-1,实际上就是打个标记<br>DM1.Model.First;<br>DM1.Model.Locate('指标代码', TempNode.Values[1], [loCaseInsensitive]);<br>DM1.Model.Edit;<br>DM1.Model.FieldValues['指标值'] := -1;<br>if TempNode <> LastNode then<br>repeat<br>TempNode := TempNode.GetNextNode;<br>DM1.Model.First;<br>DM1.Model.Locate('指标代码', TempNode.Values[1], [loCaseInsensitive]);<br>DM1.Model.Edit;<br>DM1.Model.FieldValues['指标值'] := -1;<br>until TempNode = LastNode;<br>//根据标记,逐个删除结点<br>DM1.Model.First;<br>while DM1.Model.Locate('指标值', -1, [loCaseInsensitive]) do<br>begin<br>//showmessage(DM1.Model.FieldValues['指标名称']);//[red]标记1 [/red]<br>DM1.Model.Edit;<br>DM1.Model.Delete;<br>DM1.Model.First;<br>end;<br>end;<br><br>保存按钮代码<br>procedure Tfrm_ModelEdit.cb_saveClick(Sender: TObject);<br>begin<br>try<br>DM1.Model.UpdateBatch(arAll);<br>Application.MessageBox('保存成功!', '提示', MB_OK + MB_ICONINFORMATION);<br>except<br>on E: Exception do<br>begin<br>MessageDlg('保存失败!' + E.Message, mtError, [mbOK], 0);<br>Exit;<br>end;<br>end;<br>end;<br>保存后发现,原来置上删除标记的部分结点仍然存在。<br>若将//标记1 处的加上 showmessage(DM1.Model.FieldValues['指标名称']);则执行结果完全正确<br>这是为什么?