在导航窗体中引用其他窗体控件值的报错问题
问题描述
我有一个导航窗体,希望将L3Process5窗体中DataObjectsList控件的选中值,传递到点击打开的标签页窗体的控件中。在新窗体的Form_Open事件中运行了以下查询代码:
Me.L3Processes.RowSource = "SELECT L3Process2.ID, L3Process2.L3Process, DataObjects.ID FROM DataObjects INNER JOIN L3Process2 ON DataObjects.ID = L3Process2.DataObjects.Value WHERE DataObjects.ID = '" & [Forms]!L3Process5![DataObjectsList].Column(2) & "'"
但运行时报错,提示找不到引用的L3Process5窗体,想问是不是因为原窗体已关闭?
解决方案
报错原因
大概率是L3Process5窗体在新窗体打开时已被关闭或隐藏:Access的[Forms]集合只包含当前处于打开状态的窗体,一旦原窗体关闭,就无法通过[Forms]!L3Process5引用它的控件值。
正确传值方法:使用OpenArgs参数
这是Access窗体间传值的标准方案,不依赖原窗体的存活状态:
- 在L3Process5窗体中打开新窗体时传递值
修改打开标签页窗体的代码,把需要的值通过OpenArgs参数传入:DoCmd.OpenForm "你的标签页窗体名称", OpenArgs:=Me.DataObjectsList.Column(2) - 在新窗体的Form_Open事件中接收值并构建查询
直接读取Me.OpenArgs来获取传递的值,替代原有的窗体引用:If Not IsNull(Me.OpenArgs) Then Me.L3Processes.RowSource = "SELECT L3Process2.ID, L3Process2.L3Process, DataObjects.ID " & _ "FROM DataObjects " & _ "INNER JOIN L3Process2 ON DataObjects.ID = L3Process2.DataObjects.Value " & _ "WHERE DataObjects.ID = '" & Me.OpenArgs & "'" End If
进阶优化:避免SQL注入
直接拼接字符串存在SQL注入风险,建议用参数化查询:
If Not IsNull(Me.OpenArgs) Then Dim qd As QueryDef Set qd = CurrentDb.CreateQueryDef("", _ "SELECT L3Process2.ID, L3Process2.L3Process, DataObjects.ID " & _ "FROM DataObjects " & _ "INNER JOIN L3Process2 ON DataObjects.ID = L3Process2.DataObjects.Value " & _ "WHERE DataObjects.ID = [ParamID]") qd.Parameters("ParamID") = Me.OpenArgs Me.L3Processes.RowSource = qd.SQL Set qd = Nothing End If
额外注意
如果L3Process5是导航窗体的子窗体,即使它没关闭,原引用路径也可能错误,正确的引用格式应该是Forms!导航主窗体名称!子窗体容器控件名称.Form.DataObjectsList.Column(2),但这种方式依然依赖原窗体处于打开状态,不如OpenArgs可靠。
内容的提问来源于stack exchange,提问作者The Hawk
相关产品推荐
相关产品推荐

