【发布时间】:2018-05-02 08:17:53
【问题描述】:
我遇到了一个与 Access 表单相关的奇怪情况。我有一个父表单(显示在单一表单视图中)和一个子表单(显示在连续表单视图中)。父表单显示每个项目的记录(一次一个),子表单显示每个项目的注释(全部)。
notes 子表单可以为每个项目记录包含数十或数百条记录。为了方便用户在他们拉出记录时立即开始在表单中输入注释,我在父表单的当前事件中有代码“定位”子表单中的记录以显示底部的四个现有记录然后他们可以开始输入文本的记录。该代码如下所示:
Dim mymove As Integer
Dim c As Integer
'' Attempt to scroll down in the CaseNotes subform to a convienent location
'' so that user can read the most recent note and has access to the next
'' blank note
With Me.CaseNotes.Form.Recordset
' Load the # of notes for this record
c = .RecordCount
' The display shows only 5 notes. Otherwise, you have to scroll.
' If there are more than 4 notes, we want to display just the last
' four and then have a blank line where a new note can be entered.
' The following code makes the moves necessary for this.
If c <= 4 Then mymove = c Else mymove = 4
If mymove > 0 Then
.MoveLast
.Move -mymove
End If
'move to new record
.AddNew
End With
这段代码已经工作了一百万年,一般来说没有问题。但是,最近我们向父窗体添加了一个组合框控件,允许用户为父窗体选择数据源。该组合框的更新后事件会根据用户选择的值更改父表单的 RecordSource。
一旦我们实现了这一点,我们的定位代码在您更改数据源后将不再有效。因此,您选择了一个新数据源,它将新数据加载到父表单和子表单上,然后注释子表单正确定位自身(使用上面的代码),但在将控制权交给用户之前,它恢复到音符的原始(坏)位置。不清楚为什么。定位代码正在运行(我设置了一个断点并单步执行了代码),但它正在以某种方式撤消。
无论如何,为了智取这一点,我在组合框的 after update 事件代码中添加了一些额外的代码,以便在设置 RecordSource 后重新运行定位代码。这就是事情变得奇怪的地方。这段代码运行良好...只要我手动执行它。如果我这样做(设置断点并继续按 F8),那么它将通过定位代码并将我留在我想要的位置。但是如果我不设置断点,只是让代码自己滚动,它就行不通。它似乎进行了定位,但在它让我控制表单之前,它又恢复到初始(坏)子表单位置。
那里似乎完全没有区别。在一种情况下,我手动执行,而在另一种情况下,代码只是自行运行。我认为它应该给出相同的结果。为什么这会产生不同的结果,我可以做些什么来解决这个问题?
我有一些普遍的感觉,不同的事件会根据我是否设置断点来触发,但在调试方面甚至不确定从哪里开始。任何帮助都非常感谢。
如果有用的话,我正在 Windows 7 上运行 Access 2013 32 位。
【问题讨论】: