我有一个多重表格。我的PageControl中包含Dbgrid的每个选项卡,带有一些按钮来操作这个Dbgrid。
有时,当我点击按钮删除,我的DBGrid不改变。删除后,我在DBgrid中看到我的值。
If MyTable.recordcount > 0 then
begin
str := 'Value of name field/**' + MyTable.FieldByName('Name').AsString+'**/';
If Application.MessageBox(PChar(str), PChar('NAME'), MB_OKCANCEL + MB_ICONQUESTION) = IDOK then
begin
MyTable.Delete;
end;
end;
我试着添加
MyTable.Refresh;
后删除,但它不工作。MessageBox中myfield的值是正确的!
当我在MyDBgrid中选择另一个Tabsheet时,出现此问题。它可以是焦点在我的DBGrid的问题?它可以是我的DBGrid(dsBrowser, dsEdit,…)的状态的问题?
=========================================================
我尝试为BeforeDelete事件和AfterDelete事件创建日志:
Log(1,'------------------------------------Before Del');
Log(1,Format('DataSet.IsEmpty:%s',[BoolToStr1(DataSet.IsEmpty)]));
Log(1,Format('DataSet.State:%d',[Ord(DataSet.State)]));
Log(1,'--------');
Log(1,Format('DataSet.RecNo:%d',[DataSet.RecNo]));
Log(1,Format('DataSet.TabSheet:%s',[DataSet.FieldByName('TabSheetName').AsString]));
Log(1,Format('DataSet.FieldName:%s',[DataSet.FieldByName('FieldName').AsString]));
Log(1,Format('DataSet.FieldId:%s',[DataSet.FieldByName('FieldId').AsString]));
on AfterDelete事件:
Log(1,'------------------------------------After Del');
Log(1,Format('DataSet.IsEmpty:%s',[BoolToStr1(DataSet.IsEmpty)]));
Log(1,Format('DataSet.State:%d',[Ord(DataSet.State)]));
Log(1,'--------');
Log(1,Format('DataSet.RecNo:%d',[DataSet.RecNo]));
Log(1,Format('DataSet.TabSheet:%s',[DataSet.FieldByName('TabSheetName').AsString]));
Log(1,Format('DataSet.FieldName:%s',[DataSet.FieldByName('FieldName').AsString]));
Log(1,Format('DataSet.FieldId:%s',[DataSet.FieldByName('FieldId').AsString]));
我使用表格作为:
输入图片描述
我得到这个日志
------------------------------------Before Del
DataSet.IsEmpty:False
DataSet.State:1
--------
DataSet.RecNo:7
DataSet.TabSheet:tabsheet_0
DataSet.FieldName:
DataSet.FieldId:03
------------------------------------After Del
DataSet.IsEmpty:False
DataSet.State:1
--------
DataSet.RecNo:6
DataSet.TabSheet:tabsheet_0
DataSet.FieldName:
DataSet.FieldId:03
你可以在我的日志中看到:数据集没有改变(filedname和fieldId没有改变/RecNo属性是改变)删除后,包含03
的行
由于您的问题是间歇性的,您必须自己调试它,因为读者不能为您做这些。
首先要做的是设置一个日志函数,并在数据集的BeforeDelete
和AfterDelete
事件中调用它。您应该在其中记录当前数据集行的身份,数据集的状态(dsBrowse
, dsEdit
等)以及您认为可能相关的任何其他内容(例如活动表的身份),并查看您是否可以发现在什么情况下删除失败。您可以将日志调用的结果写入表单上的TMemo。
一般来说,只有当数据集处于dsBrowse
状态时,才允许Delete操作。
顺便说一下,我假设你知道如果数据集处于dsInsert
或dsSetKey
状态,Delete操作会自动中止?根据您的描述,我将通过调查问题出现时它是否处于dsInsert
状态来开始调试。当然,您可以捕获数据集何时进入dsInsert
状态,方法是捕获其BeforeInsert
事件并从那里调用日志记录函数。