我有一个带有子窗体的窗体,该窗体绑定到临时表。临时表包含数据透视表的结果,但是我希望用户能够编辑该数据透视表,然后将更改推送到源表。
为此,我想在AfterInsert
,AfterUpdate
和Delete
上触发事件,以便我可以对更改进行操作。据我了解,子窗体的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
事件永远不会触发。
答案 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的多个子表单显示为不同的表,并在单个表单上处理不同事件处理程序中的事件。