将参数传递给使用' New'创建的Access表单。

时间:2014-10-24 20:56:56

标签: forms vba ms-access access-vba

我有一个名为' detail'其中显示了所选记录的详细视图。该记录是从名为“搜索”的不同表格中选择的。因为我希望能够打开多个“详细信息”实例,每个实例都显示不同记录的详细信息,所以我使用了以下代码:

Public detailCollection As New Collection    

Function openDetail(patID As Integer, pName As String)
'Purpose:    Open an independent instance of form
Dim frm As Form
Debug.Print "ID: " & patID

'Open a new instance, show it, and set a caption.
Set frm = New Form_detail
frm.Visible = True
frm.Caption = pName


detailCollection.Add Item:=frm, Key:=CStr(frm.Hwnd)

Set frm = Nothing
End Function

PatID是我希望在这个新细节中显示的记录的主键。'调试打印行打印出正确的PatID,所以我可以使用它。如何将其传递给表单的新实例?

我尝试设置新表单的OpenArgs,但是我收到一条错误,指出OpenArgs是只读的。在研究之后,OpenArgs只能由DoCmd设置(它不会工作,因为那时我不会获得表单的独立实例)。创建Form对象时,我找不到有关允许参数的文档。显然,微软并不认为构造函数是一种方法,至少根据文档而言。我该怎么处理? (请不要告诉我把它设置成一个看不见的文本框或者其他东西)谢谢大家,你们这些网上最好的回答这些问题。我爱你们所有人!

多实例表单的源代码取自:http://allenbrowne.com/ser-35.html

2 个答案:

答案 0 :(得分:9)

在Form_detail中,创建一个自定义属性。

Private mItemId As Long

Property Let ItemID(value as Long)
    mItemId = value
    ' some code to re query Me
End Property

Property Get ItemId() As Long
    ItemId = mItemId
End Property

然后,在创建表单的代码中,您可以执行此操作。

Set frm = New Form_detail

frm.ItemId = patId

frm.Visible = True
frm.Caption = pName

这将允许您将ID传递给新的表单实例,并确保在将其显示之前将其重新获取。如果您始终通过New打开表单,则无需每次都加载所有结果。您让属性加载数据而不是传统的Form_Load事件。

这是有效的,因为Access Form模块只不过是荣耀的类。希望这可以帮助。

答案 1 :(得分:3)

您可以尝试应用过滤器:

frm.Filter = "[ID] = " & patID
frm.FilterOn = True

详细信息表单的记录来源需要设置为ID所属的表格。

UPDATE 根据您的要求,以下是设置RecordSource的代码:

frm.RecordSource = "select * from TableName where [ID] = " & patID

这可能比使用过滤器更清晰,因为用户可以删除过滤器(取决于表单的类型)。