未绑定主窗体上的列表框链接到绑定子窗体产生 3021(无当前记录)错误

Posted

技术标签:

【中文标题】未绑定主窗体上的列表框链接到绑定子窗体产生 3021(无当前记录)错误【英文标题】:Listbox on Unbound MainForm Linked to Bound Subform Producing 3021 (No Current Record) error 【发布时间】:2018-05-11 20:01:52 【问题描述】:

3021错误问答有很多,但没有找到这个。

设置:

空白访问 2016 数据库

添加普通表(1 个 ID 列,1 个标题(字符串)列)

根据表格创建一个表格,一个显示文本框。保存并关闭

创建第二个表单。添加列表框,行源为Plain table,2列,第一列宽0。

将第一个表单作为子表单添加到第二个表单。使用 Master/CHild 将列表框链接到子表单(Master = List1,Child = ID)

基本上在主窗体上设置一个标准使用列表框来控制导航到子窗体上的特定详细子记录。

在子表单“Current”事件中,添加“debug.print Me.Recordset.Fields("ID")”

效果

在第一次加载第二个表单时,将收到 3021 未找到记录错误。不足为奇。

第一次选择列表框中的项目时,没有错误。

第二次选择列表框中的项目时,出现3021错误。

问题

对其他人可重现(我怀疑不是,这似乎是一个标准设置,我猜我正在处理损坏的 Access 安装......但是?)

如果其他人可以复制,想法是什么原因,特别是第一选择和第二选择之间的区别?替代设置?

【问题讨论】:

为什么还有 Debug 行?为什么要引用 Recordset 属性? Debug.Print Me!ID 我错过了在顶部添加这是一个精简的最小可复制示例。我通常会根据当前记录的内容来配置子表单(例如,在另一个表中查找不是表单库的一部分),但是如果“当前”事件产生无当前记录错误,我没有根据子表单中当前记录的值采取行动的方式。一种解决方法是到达主窗体并从列表框本身获取值,但这会在子窗体和主窗体之间引入紧密绑定,并且考虑到记录集似乎没有必要。 好吧,我的示例代码确实打印了当前记录的 ID。 谢谢@June7.... 您的评论为我指明了一条富有成效的研究轨道,它给了我一个有用的解决方法(我的特定用例将感兴趣的字段名存储在一个变量中)。如果您解释了为什么这两个符号之间(或更根本上是控件和记录集之间)之间的脱节,我很乐意接受一个答案(或其他任何人的)而不是我刚刚发布的答案。 【参考方案1】:

感谢@June7 评论,我挖得更深了。由于我不明白的原因,子表单记录集对象和子表单上的控件之间存在断开连接。

不能轻易地在手机上提供链接,但搜索 bang vs dot notation 提供了提示(David Fenton 回答)Me!Fieldname 表示法实际上是 Me.controls("fieldname") 的后期绑定简写,并且该参考正确工作(在子窗体当前事件中指向主窗体上列表框的更新值)

找到此内容的任何人的简写形式:使用 Me!Fieldname 或 Me.controls(variableContainingFieldname) 表示法来引用子表单当前事件中基础记录集中的字段值以避免 3021 错误)

【讨论】:

以上是关于未绑定主窗体上的列表框链接到绑定子窗体产生 3021(无当前记录)错误的主要内容,如果未能解决你的问题,请参考以下文章

使用主窗体中的未绑定文本框过滤 Microsoft Access 中的子窗体

Access VBA:未绑定的子窗体控件不可点击

该属性是只读的,不能设置

从子窗体调用主窗体

Windows 窗体中的刷新组合框

带有主窗体参数的子窗体