delphi的DBgrid怎么获取当前记录的上一条bookmark,dbgrid的数据源是dataset

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi的DBgrid怎么获取当前记录的上一条bookmark,dbgrid的数据源是dataset相关的知识,希望对你有一定的参考价值。

DBGrid1.DataSource.DataSet.Previous;
应该可以直接找到上一条记录吧.
不要直接操作数据敏感部件,你可以使用ClientDataSet,把操作跟数据库隔离出来.
只有按特定的按钮才更新数据库,不然,一量出错,而你不小心退出,就有你哭的啊
参考技术A 直接用DBgrid绑定数据源能够实现的功能还是比较局限的,你可以用三层结构,写个中间转换层,这样基本上能解决任何问题了。(ps,DBGrid控件真心不咋地,不仅UI难看,功能也不是太全面。) 参考技术B procedure TForm1.ActionLoadImageExecute(Sender: TObject);
var
vBookMark: TBookmark;
begin
vBookMark := DBGridCJ.DataSource.DataSet.GetBookmark;
try
// 你的代码
finally
DBGridCJ.DataSource.DataSet.GotoBookmark(vBookMark);
DBGridCJ.DataSource.DataSet.FreeBookmark(vBookMark);
end;
end;
// DBGridCJ 就是一个TDBGrid
参考技术C 直接去dataset对应的query上的数据就好啦追问

我的dataset结果是直接从数据库里获取的 query是直接对数据库操作的。所以应该不可以吧...有没有其它方法呢?

追答

dataset也有类似的操作啊,query也是从数据库里取出来的。都是对内存里的数据集做操作

Delphi Dbgrid 删除一条记录

【中文标题】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】:

由于您的问题是间歇性的,因此您必须自己调试它,因为读者无法为您这样做。

首先要做的是设置一个日志函数,并在数据集的BeforeDeleteAfterDelete 事件中调用它。您应该在其中记录当前数据集行的标识、数据集的状态(dsBrowsedsEdit 等)以及您认为可能相关的任何其他内容(例如活动标签页的标识),看看您是否可以发现在什么情况下删除失败。您可以将日志调用的结果写入表单上的 TMemo。

Ime,如果数据集处于dsBrowse 状态,最好只允许删除。

顺便说一句,我假设您知道如果数据集处于dsInsertdsSetKey 状态,删除操作会自动中止?根据您的描述,当您出现问题时,我将通过调查它是否处于dsInsert 状态来开始调试。当然,您可以通过捕获其BeforeInsert 事件并从那里调用您的日志记录函数来捕获数据集何时进入dsInsert 状态。

【讨论】:

以上是关于delphi的DBgrid怎么获取当前记录的上一条bookmark,dbgrid的数据源是dataset的主要内容,如果未能解决你的问题,请参考以下文章

Delphi Dbgrid 删除一条记录

delphi dbgrid 修改、更新、删除

delphi7 DBGrid 中怎么样使用多选删除二张不同的表?

delphi中如何在dbgrid中主动添加序号?求赞助!

请问如何在delphi中实现多选打印功能!

delphi定位