如果主窗体上有多个子窗体,则从 ACTIVE 子窗体打开记录

Posted

技术标签:

【中文标题】如果主窗体上有多个子窗体,则从 ACTIVE 子窗体打开记录【英文标题】:Open Record from ACTIVE Sub Form if there are there are multiple sub forms on main form 【发布时间】:2018-02-01 16:26:39 【问题描述】:

我有一个主表单[frmHome]。它有两个子表单[sbfHome][sbfRemarkHome]

我希望用户能够单击任一表单上任何记录中的任何字段并打开一个包含该记录所有相关数据的新表单。

我尝试过.ActiveControl,但它始终为 FALSE,但它不起作用。

我也在尝试使用 ActiveForm.Name 并将其放在代码的 EOF/BOF 部分中。

我怎么知道哪个子表单有焦点?

 Private Sub btnSummary_Click()
 Dim frmCurrentForm As String
 frmCurrentForm = ActiveForm.Name

 If Not (Me.frmCurrentForm.Form.Recordset.EOF And 
 Me.frmCurrentForm.Form.Recordset.BOF) Then
    With Me.frmCurrentForm.Form.Recordset
      txtEARNumber = .Fields("EAR Number")
    End With
 End If

DoCmd.OpenForm "frmView"
[Forms]![frmView].txtEARNumber = txtEARNumber
Forms!frmView.Form.Requery
Forms!frmView.Refresh
End Sub

 Private Sub btnSummary_Click()

 If Me.sbfHome.Form.ActiveControl = True Then

    If Not (Me.sbfHome.Form.Recordset.EOF And Me.sbfHome.Form.Recordset.BOF) 
    Then
        With Me.sbfHome.Form.Recordset
          txtEARNumber = .Fields("EAR Number")
        End With
    End If

Else

     If Not (Me.sbfRemarkHome.Form.Recordset.EOF And 
       Me.sbfRemarkHome.Form.Recordset.BOF) Then
       With Me.sbfRemarkHome.Form.Recordset
        txtEARNumber = .Fields("EAR")
       End With
     End If

End If

DoCmd.OpenForm "frmView"
[Forms]![frmView].txtEARNumber = txtEARNumber
Forms!frmView.Form.Requery
Forms!frmView.Refresh
End Sub

【问题讨论】:

【参考方案1】:

我想我理解你的问题。我建议使用事件来告诉父对象在子表单上执行了哪些操作。这样,焦点本身并不重要,重要的是行动发生的地方。这也意味着两个对象之间的耦合要松散得多。

在我的示例中,我制作了 3 个表单:MasterSubForm1SubForm2。我将两个子表单都绑定到一个带有一些模拟数据的表上,并将它们设为continuous forms。布局如下所示:

每个子表单中的代码都是一样的:

Option Compare Database
Option Explicit

Public Event ButtonClicked(FormName As String, RecordId As Long)

Private Sub Command0_Click()
    RaiseEvent ButtonClicked(Me.Name, Me.ID)
End Sub

这表示只要单击 Command0 按钮就会引发ButtonClicked 事件。您可以根据需要自定义事件中的这些参数。

然后在主窗体中,您可以像这样监听事件:

Option Compare Database
Option Explicit

Private WithEvents SubForm1 As Form_SubForm1
Private WithEvents SubForm2 As Form_SubForm2

Private Sub Form_Load()
    Set SubForm1 = frmSubForm1.Form
    Set SubForm2 = frmSubForm2.Form
End Sub


Private Sub SubForm1_ButtonClicked(FormName As String, RecordId As Long)
    DoSomething FormName, RecordId
End Sub


Private Sub SubForm2_ButtonClicked(FormName As String, RecordId As Long)
    DoSomething FormName, RecordId
End Sub


Private Sub DoSomething(FormName As String, RecordId As Long)
    txtMessages = "Form Name: " & FormName & ", Record ID: " & RecordId
End Sub

【讨论】:

感谢您的回复,我仍在查看是否可以修改此内容。只想注意,我的命令按钮在主窗体上,而我的子窗体只是将它们的源对象设置为 Query.qryXYZ 和 Query.qryABC 所以两个查询都只有一个表(查询结果),我只使用 .field 值从选定的记录以在单独的表单上运行查询。 我明白了,您想过滤子表单。您是否尝试过子表单上的Link Master Fields/Link Child Fields 属性?您可以将它们链接到数据源中的列,也可以链接到文本框等控件。 好吧,不...不过滤。这两个查询来自不同的来源。主窗体充当搜索。我使用文本框作为搜索来显示所有可能的记录,比如说“123”。每个查询在各个列上都有“like”*txtboxvalue 条件。查询再次是不同的来源,仅与搜索的类似值相关。然后,我想使用任一查询中所选记录的 .field 值在新表单上运行搜索。它们是不同的,但每个都有一个共同的字段,将其视为一个任务 ID。

以上是关于如果主窗体上有多个子窗体,则从 ACTIVE 子窗体打开记录的主要内容,如果未能解决你的问题,请参考以下文章

主窗体选项卡控件将值传递给选择案例的子窗体变量

C#winform中父窗体打开后下面有一排导航,导航打开子窗体,子窗体停靠在父窗体中间

将子窗体链接到主窗体上的组合框时出现问题

WPF提示窗口总在主窗体前是怎么实现的

delphi 子窗体如何继承主窗体的方法

关闭对话框和子窗体并将结果传递给主窗体