Delphi Dbgrid 删除一条记录
Posted
技术标签:
【中文标题】Delphi Dbgrid 删除一条记录【英文标题】:Delphi Dbgrid delete a record 【发布时间】:2016-08-24 08:59:51 【问题描述】:我有一个多标签页。我的 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 中 focus 的问题吗?这可能是我的 DBGrid(dsBrowser, dsEdit,...) 的 state 的问题?
================================================ ==========
我尝试为 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]));
在 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]));
我将标签页用作:
enter image description here
我得到了这个日志
------------------------------------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
您可以在我的日志中看到:删除包含03
的行后,数据集未更改(filedname 和 fieldId 未更改/RecNo 属性更改)。
【问题讨论】:
对不起,我真的不认为你的 q 充分描述了你的问题。 a)关于您的屏幕截图,当它显示的只是 DBGrid 的一部分时,您为什么要谈论标签表? b) 为什么选择行中 DBGrid 中的 LH 数据列是空白的? c)您显示的日志:这是RecNo 6被成功删除的情况吗?如果是这样,我看不出向我们展示这一点的意义 - 最好是记录没有被删除时的日志。 d) 数据集是用来记录 DBGrid 嵌入形式的属性还是什么? Iow,您的 q 并不清楚您在做什么。 顺便说一句,我认为如果你需要这方面的帮助,你将不得不在你的 q 中包含一个 MCVE - 请参阅***.com/help/mcve @MartynA 谢谢你的帮助......我尽量说清楚.. A> 我谈论标签表是因为当我更改当前标签表并直接去删除一行时,我可以重现错误选择的新标签页..在这种情况下,删除不正确... B>这个单元格是空的..我没有在这个单元格中放任何东西..C>你可以看到一个RecNo = 6但是fieldname 和 fieldId 没有改变,我的 DBgrid 界面也没有改变... D> MyDbgrid 在我创建新标签页时添加((当我添加新标签页时,我实例化了一个包含 DBGrid 的类,所有按钮)) 【参考方案1】:由于您的问题是间歇性的,因此您必须自己调试它,因为读者无法为您这样做。
首先要做的是设置一个日志函数,并在数据集的BeforeDelete
和AfterDelete
事件中调用它。您应该在其中记录当前数据集行的标识、数据集的状态(dsBrowse
、dsEdit
等)以及您认为可能相关的任何其他内容(例如活动标签页的标识),看看您是否可以发现在什么情况下删除失败。您可以将日志调用的结果写入表单上的 TMemo。
Ime,如果数据集处于dsBrowse
状态,最好只允许删除。
顺便说一句,我假设您知道如果数据集处于dsInsert
或dsSetKey
状态,删除操作会自动中止?根据您的描述,当您出现问题时,我将通过调查它是否处于dsInsert
状态来开始调试。当然,您可以通过捕获其BeforeInsert
事件并从那里调用您的日志记录函数来捕获数据集何时进入dsInsert
状态。
【讨论】:
以上是关于Delphi Dbgrid 删除一条记录的主要内容,如果未能解决你的问题,请参考以下文章
delphi7 DBGrid 中怎么样使用多选删除二张不同的表?
Delphi 用dbnavigator和dbgrid链接以后,使用dbnavigator控件的删除时会使程序崩溃,该如何处理