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