如何最好地调用在用作源对象的表单中声明的​​公共子例程来自主窗体的子窗体控件?

时间:2015-07-24 13:32:46

标签: ms-access access-vba

我有一个MyForm1表单,其中包含一个具有该方法的模块。

Public Sub CreateSQL(ProductID as variant) 

    Me.Recordsource = " SELECT * FROM ProductOrders " _ 
                      " WHERE ProductID = " & Nz(ProductID ,0)    

    Me.Requery

End Sub

我将其用作名为MyMainForm的表单的子表单。

当我在MyMainForm上更改控件的值时,它成功执行以下行:

Me.Subform1.Form.CreateSQL ProductID:=Me.cboProductID 

我的问题:

  1. 为什么在我输入Me.Subform1.Form.后出现的智能感知列表中未列出成员?

  2. 有没有办法让它们上市?

  3. 是否有一个属性可以让我访问子窗体控件“源对象属性”(即Me.Subform1.form)中引用的窗体的“Form_MyForm1”类?

  4. 这就像我需要能够写:

    Me.Subform1.Form_MyForm1.CreateSQL   ProductID:=Me.cboProductID
    

    这样的财产是否已经存在?如果是这样,我如何访问它?它在属性集合中吗?

    PS:如果您需要更多信息,请参阅长堆栈溢出问题中发布的相同问题here

    哈维

2 个答案:

答案 0 :(得分:0)

  1. 不知道。
  2. 不是我知道的。
  3. 使子功能公开。
  4. 但是看起来你可以通过使用表单及其子表单控件的主/子链接选项来省去很多麻烦。

答案 1 :(得分:0)

而是调用方法Me.Subform1.Form.CreateSQL

的mainform

您应该在子窗体中创建一个指向主窗体的对象变量,并响应事件,例如:

Dim WithEvents cvMyParentForm As Form

Property Set MyParentForm(MyParentForm As Form)

    Set cvMyParentForm = MyParentForm

End Property
Property Get MyParentForm() As Form

    Set MyParentForm = cvMyParentForm

End Property

当主窗体打开时,使用Form_Open事件来"初始化"子表格

Private Sub Form_Open(Cancel As Integer)

    If Me.Subform1.Form.MyParentForm Is Nothing Then
        Set Me.Subform1.Form.MyParentForm = Me
    End If

End Sub

然后你可以让子窗体响应主窗体引发的FORM事件。

如果您需要让子窗体响应您在主窗体中声明的任何事件,则需要使用上面的代码来使用Form_MyMainFormname类型

Dim WithEvents cvMyParentForm As Form_MyMainFormName

Property Set MyParentForm(MyParentForm As Form_MyMainFormName)

    Set cvMyParentForm = MyParentForm

End Property
Property Get MyParentForm() As Form_MyMainFormName

    Set MyParentForm = cvMyParentForm

End Property

Private Sub cvMyParentForm_Current()

    'MsgBox "Sub form current event - does syncing"

    Me.Form.Recordset.FindFirst "ID = " & Nz(cvMyParentForm.ID, 0)
    If Me.Form.Recordset.NoMatch Then
        MsgBox "Humph"
    Else

    End If

End Sub

Private Sub cvMyParentForm_MyEvent()

    MsgBox "A user define event 'MyEvent' was fired on the  main form"

End Sub