我们有一个Delphi的数据库应用程序,上面有个DBGrid和一个数据集:

DBGrid是用来显示来自数据集(查询或表)的数据,根据设计,当您调用已经打开的数据集的Refresh方

法(例如使用DBNavigator的Refresh),当前行的位置将被设置为0 (第一个记录)。

这意味着,如果用户选择了DBGrid的底部某个地方的一行记录,在刷新后,当前激活的行将改为第一行:

(

如果你一直在问:“有什么办法重新查询或刷新后,让TDBGrid中的数据留在准确位置(不改变位置)?

”这里的一个答案的问题:

刷新DBGrid的数据 - 保留行的位置
这里的一个小程序控制刷新DBGrid的内容后不会失去该行的位置。

//THackDBGrid = class(TDBGrid)
 
 //refresh datagrid data - preserve rowposition
 procedure Refresh_PreservePosition;
 var
   rowDelta: Integer;
   row: integer;
   recNo: integer;
   ds : TDataSet;
 begin
   ds :=THackDBGrid(DBGrid1).DataSource.DataSet;
 
   rowDelta := -1 +THackDBGrid(DBGrid1).Row;
   row := ds.RecNo;
 
   ds.Refresh;
 
   with ds do
   begin
    DisableControls;
    RecNo := row;
    MoveBy(-rowDelta) ;
    MoveBy(rowDelta) ;
    EnableControls;
   end;
 end;

请注意这里使用的保护破解(THackDBGrid)来获得隐藏的(protected)Row属性!

英文原文

There's DBGrid, there's adataset and we have a data awareDelphi application :)

When DBGrid is used to display data from a dataset (query ortable), by design, after you call Refresh method on a dataset(re-open) (for example, using a DBNavigator), the current row position will be setto zero (first record).

This means that if a user has selected a row somewhere near thebottom of a DBGrid, after a Refresh, the active row will be changedto first row :(

If you have been asking "Is there any way to reopen or refresh aquery, leaving the TDBGrid data exactly where it is (withoutchanging the positions)?" Here's one answer to the problem:

Refresh DBGrid Data - Preserve Row Position

Here's a handly little procedure to refresh the content of aDBGrid without losing the row position.

  1.  
    //THackDBGrid = class(TDBGrid)
  2.  
     
  3.  
    //refresh datagrid data - preserve row position
  4.  
    procedure Refresh_PreservePosition;
  5.  
    var
  6.  
      rowDelta: Integer;
  7.  
      row: integer;
  8.  
      recNo: integer;
  9.  
      ds : TDataSet;
  10.  
    begin
  11.  
      ds := THackDBGrid(DBGrid1).DataSource.DataSet;
  12.  
     
  13.  
      rowDelta := -1 + THackDBGrid(DBGrid1).Row;
  14.  
      row := ds.RecNo;
  15.  
     
  16.  
      ds.Refresh;
  17.  
     
  18.  
      with ds do
  19.  
      begin
  20.  
        DisableControls;
  21.  
        RecNo := row;
  22.  
        MoveBy(-rowDelta) ;
  23.  
        MoveBy(rowDelta) ;
  24.  
        EnableControls;
  25.  
      end;
  26.  
    end;
  27.  
     

Note the protected hack used here(THackDBGrid) to get the hidden (protected) Row property!

刷新dbgrid 而不失去当前行位置的更多相关文章

  1. Python3 Selenium WebDriver网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    Python3 Selenium WebDriver网页的前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 通过selenium webdr ...

  2. Selenium WebDriver-网页的前进、后退、刷新、最大化、获取窗口位置、设置窗口大小、获取页面title、获取网页源码、获取Url等基本操作

    通过selenium webdriver操作网页前进.后退.刷新.最大化.获取窗口位置.设置窗口大小.获取页面title.获取网页源码.获取Url等基本操作 from selenium import ...

  3. 解决DBGridEh遍历记录后不移动当前行位置的方法

    解决DBGridEh遍历记录后不移动当前行位置的方法 在用DBGridEh配合ClientDataSet使用时,需要知道用户选择了哪些记录,可用遍历记录的方法查询选择列是否为真,但在这之后,Clien ...

  4. ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。

    提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.

  5. JQuery实现页面刷新滚动条自动滚动到特定位置

    var cotentOffset = $('#6f').offset(); $('.info_box').animate({ scrollLeft: cotentOffset.left }, ); 原 ...

  6. ASP.Net页面刷新后自动滚动到原来位置

    在网上搜索之后总结了三种方式: 1.设置Page中的MaintainScrollPositionOnPostback属性为true A>.页面里有MaintainScrollPositionOn ...

  7. Sticky Footer (让页脚永远停靠在页面底部,而不是根据绝对位置)

    <!doctype html><html> <head> <meta charset="UTF-8"> <meta name= ...

  8. Asp.net 在刷新或提交页面后保持滚动条的位置

    网页内容在较长时,每次回传刷新页面或提交网页时都会定位到最顶端,非常不利于用户交互. 将Page.MaintainScrollPositionOnPostBack属性值设置为true即可实现刷新后保持 ...

  9. JS刷新页面后滚动条的位置不变

    有时候,在网页中点击了页面中的按钮或是刷新了页面后,页面滚动条又 会回到顶部,想看后面的记录就又要拖动滚动条,或者要按翻页键,非常不方便,想在提交页面或者在页面刷新的时候仍然保持滚动条的位置不变,最好 ...

随机推荐

  1. 11.7 NOIP总复习总结

    好像要1A模板题.完败 下面主要是一波SB错误总结 最小生成树(忘了sort(QwQ)) // It is made by XZZ // Fei Fan Ya Xi Lie~~~ #include&l ...

  2. SQL Server 内存和换页(Paging)

    在进程开始执行时,进程首先申请虚拟地址空间VAS(Virtural Address Space),VAS是进程能够访问的地址空间,由于VAS不是真正的物理内存空间,操作系统必须将VAS隐射到物理内存空 ...

  3. ipa包兼容性大作战!WeTest iOS深度兼容测试全新升级

    2018年,移动端适配话题热闹无比,有iOS新版本新机型发布,全面屏.异形屏.曲面屏争相斗艳,从而产生了各类特殊的屏幕分辨率设备. 正是因为这些特殊分辨率,导致2018年手机设备频繁出现适配问题,如屏 ...

  4. [翻译] Python 3.5中async/await的工作机制

    Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...

  5. nodejs 不支持 typescript (...paramName:any[])剩余参数。变相支持方式。

    node es6 变相实现支持ts的剩余参数实现方式 //.ts method assign(to: any, options?: AssignOptions, ...forms: any[]){} ...

  6. fortran shapefile学习

    试图编写一个fortran程序,用以判断给定的点是否落在给定shapefile的范围内. 需要利用到FortranGIS库 ,而该库又依赖于Shapefile C Library 安装shapelib ...

  7. 用adb来修改android嵌入式设备的system只读目录下的东西

    转的一篇: 以修改hosts文件为例: 由于某些原因,可能需要指定域名对应的IP地址.Android是基于Linux的系统,与Linux类似,通过hosts文件来设置. 在Android下,/etc是 ...

  8. 关于Netty的学习前总结

    摘要 前段时间一直在学习netty因为工作忙的原因没有写一个学习的总结,今天抽个空先把总结写了吧.事先声明,本文不会详细的介绍每一个部分不过每个部分都会附上讲解详细的url.本文只是为了解释通Nett ...

  9. JUC——线程同步辅助工具类(Exchanger,CompletableFuture)

    Exchanger交换空间 如果现在有两个线程,一个线程负责生产数据,另外一个线程负责消费数据,那么这个两个线程之间一定会存在一个公共的区域,那么这个区域的实现在JUC包之中称为Exchanger. ...

  10. WebGL之shaderToy初使用

    做图形就要玩shader,我的shader进阶之路,从学习怎么使用shaderToy开始.首先介绍我是看哪篇文章学习的,给出参考文章地址:https://blog.csdn.net/xufeng099 ...