在加载表单时,按ID访问数据表将SetFocus形式化为指定的记录

时间:2018-02-23 19:15:14

标签: vba forms ms-access

我遇到了很大的问题,在打开表单时,特定的数据表记录会成为焦点,无需用户干预。

我有一个程序如下:

Public Sub GoToID(ID As Integer, Optional fldName As String)
On Error Resume Next
    With Me.RecordsetClone
        .FindFirst "ID = " & ID
        If Not .NoMatch Then Me.Bookmark = .Bookmark
    End With
    Dim ctl As Control: Set ctl = Me.Controls(fldName)
    If Not ctl Is Nothing Then ctl.SetFocus
End Sub

当我在button_click上有这个,或者当目标表单已经打开时从另一个表单上的过程调用时,它都可以很好地工作。

我希望有类似的东西:

Private Sub Form_Activate()
    Me.GoToID User.RecordIdFromLastSession, "Title"
End Sub

我得到的行为是,执行行没有通过GotoID程序,但是加载的数据表单总是选择了最顶层的记录,并且选择了最左边的tab-stoppable字段,其中我期待记录选择器已移至User.RecordIdFromLastSession的“标题”字段。

如果我将函数调用放入表单的DblClick事件中,例如,双击表单标题,该函数运行正常,但我不能这样做,因为我在用户导航记录时动态更新User.RecordIdFromLastSession,使用Form_Current事件。

由于我似乎无法在第一个Form_Current事件触发之前选择上一个会话的记录,因此以前的会话数据将被覆盖,而哪个记录ID是表单打开时的最顶层记录。

非常感谢任何帮助/指示。

1 个答案:

答案 0 :(得分:0)

好的我现在已经对此进行了排序,但我觉得我需要在这里做一些注意事项,因为微软的指导中有些内容误导了事情。

微软说:

  

当您打开表单时,表单会发生以下事件序列:

     

打开>加载>调整大小>激活>电流

     

当您在两个打开的表单之间切换时,第一个表单会发生Deactivate事件,第二个表单会发生Activate事件   形式:

     

停用(form1)>激活(form2)

我的情况是,我已经打开了一个表单("任务"),我第一次打开另一个表单(" Memos"),然后离开任务开。

上述指导将使您假设事件的顺序为:

  

Tasks.Deactivate> Memos.Open> Memos.Load> Memos.Resize> Memos.Activate> Memos.Current

但是,当我(最终)完成所有事情时执行的事件的实际顺序是:

  

Tasks.Deactivate> Memos.Activate> Memos.Current> Memos.Open

在阅读MS的指导后,这是违反直觉的。我没有在我的表单中使用Load事件,但是相信Memos.Load必须在Memos.Open之前发生,否则Memos.Current将无法触发/识别记录中的记录。记录集。

无论如何,我想要的用例现在正在运行,并且我已经设法在此过程中显着优化了我的编码,这只能是一个额外的好处。 :)