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



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

为此,我想在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事件永远不会触发。

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

因此,在数据表视图中创建一个窗体,使用表作为源,没有代码模块,并将其用作子窗体:

  • 您的代码将被忽略。

现在,调整窗体以具有代码模块:

  • 代码按预期运行。

无论如何,这就是它在Access 2016中对我的工作方式。

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

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

为了解决此限制,我创建了一个名为frmDynDS的窗体,并将其默认视图设置为数据表视图。然后,我在设计视图中打开窗体,并使用以下代码向窗体添加了 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,在单个窗体上显示不同的表,并处理不同事件处理程序中的事件。

最新更新