尝试在访问中打开新表单时,Me.OpenArgs 始终返回 null

Posted

技术标签:

【中文标题】尝试在访问中打开新表单时,Me.OpenArgs 始终返回 null【英文标题】:Me.OpenArgs is always returning null when trying to open a new form in access 【发布时间】:2016-08-02 20:31:55 【问题描述】:

好的,我在 Access 中有一个数据库,当我打开一个表单(用于工作申请)并单击一个按钮时,它会运行以下代码:

Private Sub cmdAddDemo_Click()

DoCmd.OpenForm "sfrmAppDemographics", , , , , , txtApplID.Value

End Sub

其中 txtApplID 是一个文本框,其中填充了应用程序表中“应用程序 ID”号的数值。我希望将此值传递给“sfrmAppDemographics”表单,以便为应用程序前面提到的表单中显示的用户打开正确的人口统计信息。

所以,我在人口统计表格的代码中这样做了:

Private Sub Form_Open(Cancel As Integer)

Dim rs As DAO.Recordset
Set rs = Me.Recordset
If rs.RecordCount = 0 Then
    rs.AddNew
    rs!ApplID = Me.OpenArgs
    rs.Update
Else
    MsgBox Me.OpenArgs
End If
Me.Requery

结束子

所以,这个想法是,如果没有人口统计信息,它将使用传递的 openargs 中的 ApplID 创建一个新的,如果有此用户的人口统计数据,它会弹出一个带有 openargs 的消息框(如测试看看它是否工作)。我总是在 MsgBox 的行上收到错误“运行时错误'94':无效使用 Null”。 (因为数据库确实有人口统计记录)。当我取出 Else MsgBox Me.OpenArgs 时,它只显示数据库中的第一个人口统计信息,ApplID 为 1。奇怪。看来我无法通过 Form_Open 代码中的 OpenArgs 功能传递或访问 ApplID。有什么帮助吗?

【问题讨论】:

这对我来说没有意义。您正在尝试根据表单的记录集设置记录集?它甚至可能还没有加载——除非记录集中没有数据,否则你不会为 OpenArgs 设置陷阱——它甚至没有检查 AppID。在代码顶部放置一个Debug.Print Me.OpenArgs,它应该证明它正在传递给 Form_Open 事件 【参考方案1】:

OpenArgs 是传递给表单的字符串,仅此而已。如果要过滤被调用的表单,使用WhereCondition参数:

Private Sub cmdAddDemo_Click()

    DoCmd.OpenForm "sfrmAppDemographics", WhereCondition:="ApplID = " & txtApplID.Value

End Sub

如果您想创建不存在的记录,则将 ID 作为 OpenArgs 额外传递是有意义的:

    DoCmd.OpenForm "sfrmAppDemographics", WhereCondition:="ApplID = " & txtApplID.Value, _
                   OpenArgs:=txtApplID.Value

然后

Private Sub Form_Open(Cancel As Integer)

' No need for a separate recordset here
If Me.RecordsetClone.EOF Then
    ' We are already in a new record, just set the bound ID control to create it
    Me!ApplID = Me.OpenArgs
    ' if you want to save the new record immediately
    Me.Dirty = False
End If

End Sub

附:如果 Me.OpenArgs 在您的代码中为 Null,则 txtApplID 为 Null。我看不出其他原因。

【讨论】:

但是,当我打开一条还没有人口统计数据的记录时,它似乎崩溃了,它告诉我“运行时错误'2448'你不能为这个对象赋值”就行了 Me!ApplID = Me.OpenArgs。如何让它创建一个新的、空白的人口统计数据? 您在表单上是否有名称为ApplID(并绑定到ApplID 列)的控件?如果否,请为其创建一个文本框 - 当一切正常时,您可以将其设置为 Visible=False。如果是,它是锁定的还是什么? 是的,有一个名为 ApplID 的控件,它绑定到同名的列。也没有锁。奇怪的。 Me.OpenArgs 确实通过了正确的 ApplID 编号,但它不想设置文本框值。当人口统计数据尚不存在时,我还需要做些什么来为人口统计数据创建新记录吗?【参考方案2】:

只需将 DoCmd.GoToRecord , , acNewRec 添加到 Andre 的代码中,它就可以顺利运行...

Private Sub Form_Open(Cancel As Integer)

    If Me.RecordsetClone.EOF Then

        DoCmd.GoToRecord , , acNewRec

        Me!ApplID.Value = Me.OpenArgs

        Me.Dirty = False

    End If

End Sub

【讨论】:

以上是关于尝试在访问中打开新表单时,Me.OpenArgs 始终返回 null的主要内容,如果未能解决你的问题,请参考以下文章

MS Access VBA - 不知何故没有通过 OpenArgs,总是 NULL

我在尝试打开/显示新表单时有时会收到 ArgumentException 参数无效,为啥?

如何在VB中打开一个新表单但关闭旧表单

访问一次打开的一个表单

访问:当我输入新记录时,更改不会出现在我的子表单中

在 jquery 移动面板中打开一个新的 Web 表单