Access连续窗体Requery后返回记录原显示位置的实现方法
抱歉,我的英文内容由谷歌翻译生成。
Access连续窗体刷新后保持记录原有可视位置的实现方案
长久以来这个问题一直困扰着我,在所有相关讨论渠道都未找到对应的解决方案,因此我将自己摸索出的解决方法公开,供大家参考使用。
常规刷新定位方案的体验缺陷
在使用Access连续窗体时,有时需要刷新窗体数据源,通常大家会借助书签等方式定位回刷新前所在的记录,但存在明显体验问题:
假设当前窗体显示第40-60条记录,光标停在第45条记录(即当前可视区域内的第5行),刷新后重新定位到第45条记录时,该记录不会显示在原来的第5行位置,而是会显示在可视区域的最顶部,容易给用户造成混淆。
我一直尝试寻找实现方案,让刷新后目标记录仍保持在可视区域内的原有位置,用户感知不到刷新带来的位置变化。
实现原理
可以通过CurrentSectionTop属性实现该需求:该属性表示当前位置相对于窗体上边缘的坐标,计算偏移量时需要减去窗体页眉的高度。
具体实现代码
Const MaxRecordInViwe = 50 Const ValuePerLine = 564 MySelTop = Me.SelTop CurrentRowInViwe = (Me.CurrentSectionTop - Me.FormHeader.Height) / ValuePerLine Me.Requery Me.SelTop = (MySelTop - MyCurrentRowInViwe) + MaxRecordInViwe Me.SelTop = MySelTop - MyCurrentRowInViwe Me.SelTop = MySelTop
参数适配方法
- 如果你的窗体可视区域内可显示超过50条记录,可修改常量
MaxRecordInViwe的默认值;如果可视区域显示条数少于50,保持默认值即可。 - 常量
ValuePerLine是适配我个人所用窗体的数值,我暂未找到对应的通用计算公式,大家可以通过以下步骤手动获取适配自己窗体的数值:- 定位到窗体第一条记录
- 在VBA立即窗口输入以下代码,获取基准坐标值:
?Form_table1.CurrentSectionTop - Form_Table1.FormHeader.Height - 在窗体中定位到第二条记录
- 回到立即窗口输入以下代码,计算单行对应的坐标差值:
?(Form_table1.CurrentSectionTop- Form_Table1.FormHeader.Height)- {上一步得到的结果}) - 将最终得到的计算结果赋值给
ValuePerLine常量即可。
内容的提问来源于stack exchange,提问作者יעקב טורק
相关产品推荐
相关产品推荐

