- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我几乎已经完成了一些代码来解决去年这个未回答的问题中的问题:
Refresh Nested DataSet with poFetchDetailsOnDemand
公认的观点是,如果不关闭并重新打开主 CDS,就不可能从服务器刷新嵌套的详细 CDS,但显然,仅仅为了刷新单个主行及其详细信息行。
我想到了一个简单的方法来刷新详细CDS来自服务器,它几乎可以工作。我下面的代码基本上暂时进行了详细刷新对主 ADO 查询应用过滤器以将其过滤到当前主行,并且在该过滤器生效时,通过应用类似的过滤器来刷新主 CDS,然后调用其 Refresh 方法。这是由主 CDS AfterScroll 事件触发的。
只有一个很小问题:在我的表单以及 4 个数据集和随附的网格上,表单上有一个刷新按钮,它调用我的 RefreshcdsMasterAndDetails ,即也在 cdsMasterAfterScroll 中调用。如果我使用其网格在主 CDS 上移动,我的代码一切正常,并且详细信息 CDS 行以及 AdoQuery 详细信息 <> 中的行会立即正确更新,但如果我通过单击“刷新”按钮触发它,则 CDS 详细信息行仅在我单击“刷新”按钮时每秒更新一次。
我的问题是:为什么当我的代码是从按钮单击触发而不是从 AfterScroll 事件触发时,它的效果会有什么不同,因为它可靠地执行了从 AfterScroll 事件调用的应该执行的操作但只有在点击按钮时才会触发?
//Obviously MasterPKName below is a const and DoingRefresh is a boolean
// flag on the form
procedure TForm1.cdsMasterRowRefresh(MasterPK : Integer);
begin
if DoingRefresh then Exit;
DoingRefresh := True;
try
cdsMaster.Prior;
cdsMaster.Next;
cdsMaster.Filter := MasterPKName + ' = ' + IntToStr(MasterPK);
cdsMaster.Filtered := True;
cdsMaster.Refresh;
cdsMaster.Filtered := False;
cdsMaster.Locate(MasterPKName, MasterPK, []);
finally
DoingRefresh := False;
end;
end;
procedure TForm1.qMasterRowRefresh(MasterPK : Integer);
begin
qMaster.Filter := MasterPKName + ' = ' + IntToStr(MasterPK);
qMaster.Filtered := True;
qMaster.Refresh;
cdsMasterRowRefresh(MasterPK);
qMaster.Filtered := False;
qMaster.Locate(MasterPKName, MasterPK, []);
end;
procedure TForm1.RefreshcdsMasterAndDetails;
var
MasterPK : Integer;
begin
MasterPK := cdsMaster.FieldByName(MasterPKName).AsInteger;
cdsDetail.DisableControls;
cdsMaster.DisableControls;
qDetail.DisableControls;
qMaster.DisableControls;
try
qMasterRowRefresh(MasterPK);
finally
qMaster.EnableControls;
qDetail.EnableControls;
cdsMaster.EnableControls;
cdsDetail.EnableControls;
end;
end;
procedure TForm1.cdsMasterAfterScroll(DataSet: TDataSet);
begin
RefreshcdsMasterAndDetails;
end;
最佳答案
尽管进行了大量仔细的观察和调试,我仍然没有一个令人满意的解释来解释为什么我的 CDS 刷新代码如果在主 CDS 的 AfterScroll 事件中调用,则行为会有所不同,其中详细信息 CDS 始终会正确更新,并且在 ButtonClick 处理程序中,其中详细 CDS 仅在每秒单击一次时更新。我想那是某事与主 CDS 的光标此时已经移动的事实有关与我单击按钮的情况不同,调用 AfterScroll 处理程序。
但是,我找到了一个简单的解决方法和修复方法。
解决方法就是不要在之前的 4 个数据集上调用 DisableControls进行刷新。然后详细 CDS 始终会正确刷新。任何其他禁用部分或全部数据集的排列会导致我的 q 的差异。不过,我不喜欢这种解决方法,因为 cdsMaster DBGrid 必须一直滚动数据,只需刷新一个主行及其详细信息即可。
解决办法是做一些我一开始就应该做的事情,即强制详细 ADO 查询的刷新(使用我的数据,只需调用其刷新,这是我的第一次尝试在修复时,会引发熟悉的 Ado 错误“关键列信息不足用于更新...”尽管详细信息表在服务器上有一个 PK)。
因此,解决方法如下:
procedure TForm1.qMasterRowRefresh(MasterPK : Integer);
begin
try
qMaster.Filter := MasterPKName + ' = ' + IntToStr(MasterPK);
qMaster.Filtered := True;
qMaster.Refresh;
// Do NOT omit the next 3 lines, needed to ensure that the detail query
// and hence the detail CDS, is refreshed
qDetail.Parameters.ParamByName(MasterPKName).Value := MasterPK;
qDetail.Close;
qDetail.Open;
cdsMasterRowRefresh(MasterPK);
finally
qMaster.Filtered := False;
qMaster.Locate(MasterPKName, MasterPK, []);
end;
end;
当我通过调查一个早期未回答的问题来进入这个问题时,我会将代码的更新版本移植到该版本的答案。
关于delphi - 刷新嵌套在 DataSetField 中的 ClientDataSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685699/
我们知道,当使用 hibernate 对数据库进行批量更新时(即使在 HQL 中),所做的更改不会复制到存储在当前 session 中的实体。 所以我可以调用 session.refresh 来加载对
我正在做一个项目,所有的东西都保存在事件中,所以服务器需要一些时间来响应新数据。我正在使用 Fluent 等待使用 ajax 的页面,但是这个不使用任何 ajax。所以我想刷新页面检查是否有新项目,如
我有一个从 Vector 创建的 JTable。 如何刷新 JTable 以显示添加到 Vector 的新数据? 最佳答案 当 TableModel 发生更改时,您的 JTable 应该会自动更新。我
有没有办法使用下面的代码来刷新已经存在的 div id,而不是刷新时间? window.onload = startInterval; function startInterval() {
我更新了在 Shiny Server 上运行的 Shiny 应用程序使用的 DataSet.RData。但是, Shiny 的应用程序仍在旧数据上运行。我已通过浏览器历史记录清除并重新启动浏览器几次,
我的应用程序中有一个无限滚动的网格面板(ExtJs 4.2.1),类似于 this example .用户可以单击刷新按钮,然后必须使用数据库中的数据更新网格的行。我在刷新按钮处理程序中调用 stor
我不知道这三种方法中哪一种最适合我。他们都为我工作。有谁知道刷新、更新和重画之间的区别吗? 最佳答案 根据在线文档: Refresh - 重新绘制屏幕上的控件。 Call Refresh method
有什么办法吗 ICollectionView.Refresh() 或者 CollectionViewSource.GetDefaultView(args.NewValue).Refresh(); 在
这个问题已经有答案了: Updating address bar with new URL without hash or reloading the page [duplicate] (4 个回答)
我有一个 javascript 设置超时以在 10 秒后关闭 div,并且我想在 div 关闭时添加页面刷新。我正在使用的代码如下。 var container_close_sec = "1
我有一组具有以下名称的页面.... update1.php update2.php update3.php update4.php update5.php update6.php update7.ph
如果是则触发js函数。我可以使一个复选框保持选中状态,并在页面刷新时检查值并选中“checked”,并提交以下内容... checked="checked" /> 你都不记得触发js函数。 这是我的
我正在尝试刷新 php 脚本以在数据库更新时显示更新的内容。我首先构建了我的 php,然后刷新代码,然后合并它们。但是,脚本不会更新。有谁知道为什么吗? $(document).ready
当我要删除的节点扩展集合类型时,Grails中有一个错误阻止我使用removeFrom *。直接从关联中删除节点不会更新二级缓存。 A hasMany B 有什么方法可以使关联缓存手动无效或强制重新加
我正在使用 hibernate 和 mysql 来抽象一个数据库,以便在 java 驱动的网站中使用。我使用 hibernate 很好地解决了所有查询,但似乎无法弄清楚如何使用它进行更新、插入和删除,
如何通过调用 oncreateview 方法重新创建 fragment ?我有一个 fragment ,用于通过表单插入新数据,单击按钮后,我想通过删除在 EditText 中输入的数据来重新创建 f
当我从一个到另一个时,我试图刷新我的观点。我知道我应该将刷新代码放在 viewWillAppear 中,但我不知道该放什么代码。 你们能帮帮我吗? 谢谢! 最佳答案 在您看来,请调用 setNeeds
我正在开发 iPhone 应用程序并希望使用: CFStreamCreatePairWithSocketToHost(NULL, url, port, &serverReadStream, &serv
看到我已经创建了一个用于登录用户的脚本。而且我还添加了设置选项卡,以便用户可以编辑他们的设置!但是当我尝试它时,mysql 表中的数据发生了变化,但配置文件中显示的用户名和用户电子邮件保持不变!当我注
好的。这就是它的样子。 当我启动应用程序时,我从服务器收到的第一件事是数据: {name: "test", type: "checkbox" checked: true, } 这使得其中一个复选框
我是一名优秀的程序员,十分优秀!