我在Access中有一个表单,其中有2个未绑定的多选列表框,其中有一些代码可以在它们之间移动项目。
列表框中显示的表中的每个字段都是布尔值 - 如果值为true,则该字段的名称显示在lstSelected
中,如果false显示在lstUnselected
中}。
列表框的RowSourceType为Value List,值列表是以编程方式生成的,方法是查看底层记录并构造一个字符串名称的字符串,其中布尔值为lstSelected
为真,{{{{{ 1}}。
在表单上,我有两个按钮,lstUnselected
和cmdMoveToSelected
。当我单击cmdMoveToUnselected
时,它会通过执行SQL字符串将cmdMoveToSelected
列表框中任何选定项的基础字段的布尔值从false更改为true,然后重建两个列表框的值列表。
我把所有这些工作都很好。如果我执行了lstUnselected
和me.lstUnwanted.requery
,那么一切都会正确显示,并且正确编辑了基础字段,但是当我点击表单上的任何其他内容时,我会收到错误:
数据已更改。
在您尝试保存更改之前,另一位用户编辑了此记录并保存了更改。
重新编辑记录。
现在我找到了解决方法(me.lstwanted.requery
是正在处理的记录的主键):
jobDetailsID
这会重新查询表单,然后移回当前记录,这就消除了错误,但是它会导致延迟并且表单在第一个记录打开时闪烁,更改回正确记录并重新填充列表框。
有没有办法可以解决这个错误,或者让它以编程方式触发,以便通过vba关闭警告来捕获它?
提前致谢。
答案 0 :(得分:1)
也许有助于不将表单绑定到cmdMoveToSelected所更改的表,而是绑定到不包含所有布尔字段的查询。如果cmdMoveToSelected更改一个或多个布尔字段,则记录将更改,但查询结果不会更改。不确定它是否合理。
它听起来有点像设计问题而不是表单问题,将选项存储在布尔字段中而不是存储在相关表中。
答案 1 :(得分:0)
可能最好的解决方案是不直接更新表格中的当前记录,而表格是脏的。相反,当项目从一个列表框移动到另一个列表框时,更新表单本身(Me!FieldName
)中字段的值,并让表单照常将这些值写回表中。
答案 2 :(得分:0)
我似乎修好了它,虽然修复对我来说没有多大意义。
我在Me.Refresh
添加了按钮点击代码,在我重新获得两个列表框之后,它似乎已经停止了消息的出现。 然而这只适用于我在表单上显示JobDetailsID
文本框的情况(虽然我希望这是任意的,并且任何字段链接的文本框都可以使用)。
有人可以向我解释为什么会这样吗?我想完全理解何时使用requery,刷新等
答案 3 :(得分:0)
当我将控件转换为未绑定的文本框等后,将表单RowSource查询挂起,我发生了这种事情。一般的Form rowsource查询(引入所有字段我可能最终使用)为我提供了与表字段名相同的查询列表,使得根据需要选择控件名称变得简单。工作正常,但您必须在所有名称匹配后删除表单行源查询。 (之后DLookup和BeforeUpdate用于获取和存储值和更改。)