当子窗体绑定到表时,是否有可能在子窗体的表单上引发事件?

时间:2018-08-15 08:51:11

标签: vba ms-access events access-vba

我有一个带有子窗体的窗体,该窗体绑定到临时表。临时表包含数据透视表的结果,但是我希望用户能够编辑该数据透视表,然后将更改推送到源表。

为此,我想在AfterInsertAfterUpdateDelete上触发事件,以便我可以对更改进行操作。据我了解,子窗体的form属性是在子窗体绑定到表时引用的临时数据表窗体。但是,我无法获得此临时表格来引发任何事件。

MCVE:

我有一个具有单个表 Table1 ,单个表单 Form1 的数据库,并且该表单具有一个未绑定的子表单控件。

我有一个类, Class1 ,具有以下代码:

Private WithEvents subformForm As Access.Form

Public Sub Init(subformControl As Access.SubForm)
    Set subformForm = subformControl.Form
    subformForm.OnCurrent = "[Event Procedure]"
End Sub

Private Sub subformForm_Current()
    MsgBox "Current!"
End Sub

Form1 表单具有以下代码:

Private c1 As Class1

Private Sub Form_Load()
    sub1.SourceObject = "Table.Table1"
    Set c1 = New Class1
    c1.Init sub1
End Sub

但是,当我移动记录,添加记录以及在该子表单中执行任何操作时,subformForm_Current事件永远不会触发。

2 个答案:

答案 0 :(得分:2)

这是因为子窗体对象不是具有代码模块的窗体。因此,事件过程无处运行。

因此,在datasheetview中使用表作为源,没有代码模块,创建一个表单,并将其用作子表单:

  • 您的代码将被忽略。

现在,将表单调整为具有代码模块:

  • 您的代码按预期运行。

无论如何,这就是Access 2016中对我有用的方式。

答案 1 :(得分:0)

正如古斯塔夫(Gustav)向我指出的那样,表单需要一个模块来引发事件。

这意味着您不能使用自动创建的临时数据表表单。但是您可以创建自己的表单来代替它。

要解决此限制,我创建了一个名为 frmDynDS 的表单,并将其默认视图设置为datasheet视图。然后,我在设计视图中打开该表单,并使用以下代码向该表单中添加255个文本框:

Public Sub DynDsPopulateControls()
    Dim i As Long
    Dim myCtl As Control
    For i = 0 To 254
        Set myCtl = Application.CreateControl("frmDynDS", acTextBox, acDetail)
        myCtl.Name = "Text" & i
    Next i
End Sub

我添加了一个模块,并添加了以下代码以将表格动态加载到表单中:

Public Sub LoadTable(TableName As String)
    Dim fld As DAO.Field
    Dim l As Long
    Me.RecordSource = TableName
    For Each fld In Me.Recordset.Fields
        With Me.Controls("Text" & l)
            .Properties("DatasheetCaption").Value = fld.Name
            .ControlSource = fld.Name
            .ColumnHidden = False
            .columnWidth = -2
        End With
        l = l + 1
    Next
    For l = l To 254
        Me.Controls("Text" & l).ColumnHidden = True
    Next
End Sub

然后,我可以将 Class1 调整为以下内容:

Private WithEvents subformForm As Access.Form

Public Sub Init(subformControl As Access.SubForm, TableName As String)
   subformControl.SourceObject = "Form.frmDynDS"
    Set subformForm = subformControl.Form
    subformForm.LoadTable TableName
    subformForm.OnCurrent = "[Event Procedure]"
End Sub

Private Sub subformForm_Current()
    MsgBox "Current!"
End Sub

Form1 如下:

Private c1 As Class1

Private Sub Form_Load()
    Set c1 = New Class1
    c1.Init sub1, "Table1"
End Sub

使用这种方法,您可以有一个子窗体,该子窗体可以在数据表视图中显示动态创建的表,并处理该子窗体的事件。

您可以将绑定到frmDynDS的多个子表单显示为不同的表,并在单个表单上处理不同事件处理程序中的事件。