我有一个具有图像的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的活动。这样做时,很少有人要考虑。

  1. 如果您在VBA中调用非模式Winform,则withvents/raiseevent。它应该按预期正常工作。不需要重大的解决方法
  2. 如果您在VBA中调用Modal Winform。事件/raiseevents可能会根据要求无法正常工作。快速解决方法是使用模块文件中声明的公共变量传输数据。

您将需要使用解决方法,我相信它将非常有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top