首页 文章

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

提问于
浏览
4

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

要做到这一点,我想在 AfterInsertAfterUpdateDelete 上发布事件,以便我可以根据变化采取行动 . 据我所知,子表单's form property refers to a temporary datasheet form when the subform is bound to a table. However, I can' t获取此临时表单以引发任何事件 .

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 回答

  • 2

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

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

    • 您的代码被忽略 .

    现在,调整表单以获得代码模块:

    • 您的代码按预期运行 .

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

  • 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,并在单个表单上处理不同事件处理程序中的事件 .

相关问题