我有一个名为' 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
答案 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
这可能比使用过滤器更清晰,因为用户可以删除过滤器(取决于表单的类型)。