如果主窗体上有多个子窗体,则从 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 个表单:Master
、SubForm1
和 SubForm2
。我将两个子表单都绑定到一个带有一些模拟数据的表上,并将它们设为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 子窗体打开记录的主要内容,如果未能解决你的问题,请参考以下文章