【问题标题】:Passing arguments to Access Forms created with 'New'将参数传递给使用“新建”创建的访问表单
【发布时间】:2014-12-20 18:38:42
【问题描述】:

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

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

【问题讨论】:

    标签: forms ms-access vba


    【解决方案1】:

    在您的 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 传递给新表单实例,并确保在使其可见之前对其进行重新查询。如果您总是通过Newing 打开表单,则无需每次都加载所有结果。您让属性加载数据,而不是传统的Form_Load 事件。

    之所以有效,是因为 Access Form 模块只不过是美化的类。希望这可以帮助。

    【讨论】:

    • 不错。我什至不知道“财产”这样的东西是否存在。通过我所做的所有谷歌搜索,您认为它会在某个时候弹出。我已经通过设置记录源实现了该解决方案,但是我在确定某个特定细节是否已经打开时遇到了问题。这应该为我解决这个问题。此外,记录源选项还有一些其他问题,例如使用 patID 从详细视图中的其他表加载数据。必须从与表单记录源相同的位置设置它们。谢谢RubberDuck。
    • 不客气!我很高兴能帮上忙。我强烈推荐CPearson's article about classes in VBA。它应该有助于解决您对它为何有效的任何疑问。
    • 感谢 RubberDuck 的帮助。作为从 Java/Python 学习 OOP 的人,我发现 VBA ......很奇怪。我知道我想要的算法,但我正在谷歌搜索我想做的每一件小事。越来越烦了我能得到的所有信息都很有用,而微软并不容易找到。
    • 我不想太健谈,但I've been collecting useful links on my blog。可能是一些值得收藏的东西。还有Code Review's vba chatroom
    • TY。我会检查这些。我需要帮助。在求助于 MSDN 之前的任何事情。 =)
    【解决方案2】:

    您可以尝试应用过滤器:

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

    Detail表单的Record Source需要设置为ID所属的表。

    更新 根据您的要求,这里是设置 RecordSource 的代码:

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

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

    【讨论】:

    • 我希望我对 VB 有足够的了解,知道这是否可行。我得试试看。我想查询BE只返回一条记录,以减轻多用户环境的负载。今晚我将对此进行调查。感谢您的回答。
    • 我只是在想唱片来源。如果将 recordSource 设置为查询字符串,则数据将在那里。这可能就是我需要做的。如果您在答案中添加几行代码,将记录源设置为带有过滤器的表,以及根据 patID 从表中返回单个记录的查询,那么对于下一个人和我来说,您的答案将是完整的应绿色复选标记你。 =) 如果不是,我会稍后再做,仍然勾选你。感谢您的帮助!
    • 我只是想通过 GUI 设置 recordSource 属性,除非它也需要是动态的。
    • 抱歉,Fungus,您的解决方案运行良好,但存在一些问题。 RubberDuck 的答案最终效果更好,并且对于想要做其他事情然后选择记录的人来说还有其他可能的应用程序。必须对他进行绿色检查。感谢您的帮助Fungus,不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多