事件未在MS Access VBA中发射
-
03-10-2019 - |
题
我有一个具有图像的MS访问表格。该图像具有点击事件,该事件打开模式表格。模态表单具有确定和取消按钮。当您单击确定按钮时,应该发射一个事件,该事件告诉主单是单击哪个按钮。 (这是为了模拟C#中的拨号功能)。但是,事件处理程序中的代码从未运行。
模态形式在一般声明中具有以下内容:
Public Event OnDialogBoxClose(NewRecordID As Long, DialogResult As DialogResults)
以及单击确定按钮的以下代码:
RaiseEvent OnDialogBoxClose(NewHardwareBaseItemID, dlgresBtnOKClicked)
主要形式在一般声明中具有以下内容:
Dim WithEvents RespondQuickAddClose As Form_qckfrmHardwareBaseItemCreate
以及以下活动处理程序:
Private Sub RespondQuickAddClose_OnDialogBoxClose(NewRecordID As Long, DialogResult As DialogResults)
MsgBox "Responding to closing of the dialog box" 'Never happens
Me.Requery
End Sub
有人可以解释为什么从未打电话给活动处理程序吗?谢谢!
背景:
所有这些的目的是允许模态对话框添加一个条目,然后将条目的ID返回到主表单以设置控件的值。例如,想象一下您正在填写保险表,您需要选择一辆汽车品牌,而这不在那里。您单击一个带有模态对话框的图标,以允许您添加汽车品牌。然后,当您单击“确定”时,它将带您回到保险表格,并选择刚创建的汽车品牌。
这是我在这里找到的一个示例:http://database.itags.org/ms-access-database/80292/
解决方案
通过应用不同的开发环境中的概念访问VBA,您的生命使自己的生活变得太复杂了。尽管VBA确实支持事件/raiseevent,但没有理由在这里变得复杂。
使用访问中对话的通常方法是,您将其隐藏起来,而不是关闭它们。这允许在表格打开后运行后的代码,同时将值以可在该代码中使用的表单中使用。
报告中的示例代码在报告的on open事件中,该报告打开了用于收集值过滤报告的表格:
Private Sub Report_Open(Cancel As Integer)
DoCmd.OpenForm "dlgDateRange", , , , , acDialog, "ThisYear"
If IsLoaded("dlgDateRange") Then
With Forms!dlgDateRange
If .Tag = "Cancel" Then
Cancel = True
Else
Me.Filter = "[InvoiceDate] Between #" & !txtStart & "# AND #" & !txtEnd & "#"
Me.FilterOn = True
Me!lblDateRange.Caption = StrConv(Trim(("from " + varZLStoNull(Format(!txtStart, "mm/dd/yyyy"))) _
& (" to " + varZLStoNull(Format(!txtEnd, "mm/dd/yyyy")))), vbProperCase)
End If
End With
DoCmd.Close acForm, "dlgDateRange"
End If
End Sub
对话框表格有两个命令按钮,继续>>并取消。取消按钮将表单的标签设置为“取消”,并将表单的。可视属性设置为false。继续>>按钮除了将表单的可见属性设置为false,无能为力。单击这些按钮中的任何一个允许使用Acdialog开关打开表单后的代码在线上继续。
我的理念是使对话尽可能愚蠢。通话代码必须知道其在表格中寻找的内容(即,您需要知道您正在读取数据的控件的名称),但是可以通过将客户属性添加到表单中来解决。但是然后您必须知道属性名称,所以您刚刚将球移动了。
我还通过将Dailog表单包裹在类模块中,然后将呼叫上下文简单地初始化了类的实例,然后在适当的时间将其拉出值。但这实际上比上述方法更复杂。
其他提示
好吧,我不同意
“尽管VBA确实支持事件/raiseevent,但没有理由在这里变得复杂。”
我曾从事各种VB6和VBA项目。最近,我在Excel中编码了VBA,在那里筹集了Winform的活动。这样做时,很少有人要考虑。
- 如果您在VBA中调用非模式Winform,则withvents/raiseevent。它应该按预期正常工作。不需要重大的解决方法
- 如果您在VBA中调用Modal Winform。事件/raiseevents可能会根据要求无法正常工作。快速解决方法是使用模块文件中声明的公共变量传输数据。
您将需要使用解决方法,我相信它将非常有效。