我有一个子表单的表单绑定到临时表 . 临时表包含数据透视表的结果,但我希望用户能够编辑该数据透视表,然后将更改推送到源表 .
要做到这一点,我想在 AfterInsert
, AfterUpdate
和 Delete
上发布事件,以便我可以根据变化采取行动 . 据我所知,子表单'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 回答
这是因为子表单对象不是具有代码模块的表单 . 因此,无处运行事件过程 .
因此,使用表作为源,没有代码模块在datasheetview中创建一个表单,并将其用作子表单:
现在,调整表单以获得代码模块:
无论如何,这就是它在Access 2016中对我有用的方式 .
正如Gustav向我指出的那样,表单需要一个模块来引发事件 .
这意味着您无法使用自动创建的临时数据表表单 . 但是您可以创建自己的表单来取代它 .
为了解决这个限制,我创建了一个名为frmDynDS的表单,并将其默认视图设置为datasheet视图 . 然后,我在设计视图中打开表单,并使用以下代码向表单添加了255个文本框:
我添加了一个模块,并添加了以下代码以动态地将表加载到表单中:
然后,我可以将Class1调整为以下内容:
Form1到以下内容:
使用此方法,您可以拥有一个子窗体,该子窗体可以在数据表视图中显示动态创建的表,并处理该子窗体的事件 .
您可以将多个子表单绑定到显示不同表的frmDynDS,并在单个表单上处理不同事件处理程序中的事件 .