【问题标题】:MS Access: passing parameters from one access form to anotherMS Access:将参数从一种访问形式传递到另一种访问形式
【发布时间】:2009-09-10 21:54:51
【问题描述】:

我有一个表格和一个按钮。我想通过从父表单传递到子表单的参数单击按钮打开另一个表单(子表单的 RecordSource 有参数)。我该怎么做?

【问题讨论】:

    标签: ms-access


    【解决方案1】:

    您可以通过引用表单的对象来引用调用表单的任何属性。我不会用!表单属性的符号(我讨厌它)。所以如果你想继承:

    表单的控件值:

    forms(parentFormName).controls(controlName).value 
    

    表单的记录集字段值:

    forms(parentFormName).recordset.fields(fieldName).value
    

    记录集周转在访问 id (guid) 值时特别有用。您无法通过表单的控件读取这些值,但可以通过记录集中的相应字段访问它们。如果您在包含 guid 字段的表单上有一个组合框,请比较以下内容:

     screen.activeForm.controls(myComboControlName).value
    

     screen.activeForm.recordset.fields(myComboControlName).value
    

    【讨论】:

    • 在 Forms()、Controls() 和 Fields() 中,您的答案写得好像您提供的是表单/控件/字段的名称,但您的代码将它们视为变量。如果它们是字符串值,即您的表单名为“parentFormName”,那么您需要引号。
    • 表单有一个 Fields 集合,在 Access 2000 之前,它非常可靠(这是一件好事,因为表单没有 Recordset 属性)。从那时起,要使用来自底层记录集的值,您必须使用表单的记录集(就像您所做的那样,但我发现这样做和使用 ! 一样令人反感,我认为这比 . 运算符要好得多,因为它将控件与表单的属性/方法/成员区分开来;但我离题了),或者为了可靠性,有一个隐藏控件,该字段作为其 ControlSource。
    • .Value 是不必要的,因为它是默认属性。您可以指定它的唯一情况是,如果您将控制值传递给传递参数 ByRef 而不是 ByVal 的子例程/函数。即使参数定义为 ByRef,使用 .Value 也会强制使用 ByVal。但是,当然,如果子/函数假设它正在获取一个控制引用,那可能会破坏它。
    • Forms("parentFormName").Controls("controlName").Value 等同于:Forms("parentFormName")("controlName") - 同样,Forms("parentFormName")。 Recordset.Fields("fieldName").Value 与 Forms("parentFormName").Recordset("fieldName") 相同。
    • 好吧,我想我的“完整”符号的主要优点是设置了一个规则,这样每个人都可以准确地知道他在写什么,即使它需要代码编写者的一些额外的打字技巧。并且底层的思想很明确:有一个表单对象。该对象具有集合(例如控件)和属性(例如记录集),它们本身可以具有集合(字段)。标准、清晰且普遍理解,因此即使是从未听说过 Access 的人也能轻松理解我们在说什么。
    【解决方案2】:

    如果父窗体是打开的,你可以执行以下操作

    Forms!MyParentForm!myPublicVariableOfParentForm
    

    可能还有其他方法,您可以使用父表单中的参数调用子表单上的方法。请记住,控件在被操作之前可能需要获得焦点。

    【讨论】:

      【解决方案3】:

      您可以使用“OpenArgs”。调用表单时,只需传递您的 OpenArgs 字符串,然后在子表单上读取并解析。您可以准备自定义解决方案来构建解析更复杂的“OpenArgs”字符串。 参考: http://msdn.microsoft.com/en-us/library/bb215912.aspx

      【讨论】:

        【解决方案4】:

        参考上面大卫的评论:

        .Value 是不必要的,因为它是默认属性。您可以指定它的唯一情况是您传递控制值 到传递参数 ByRef 而不是的子例程/函数 拜瓦尔。使用 .Value 强制 ByVal 即使参数定义为 参考文献。但是,当然,如果子/功能假设它正在获得 控制参考,可以打破它...


        ByRef/ByVal::这对我有用。我有一个包含两个日历对象的表单,并希望从另一个模块子引用每个对象的值。我使用 ByRef 还是 ByVal 似乎并不重要。下面的例子我使用了 ByRef。

        public sub nameofsub(byref calendarfromdate as string, byref calendartodate as string)
         docmd.runsql("select fieldname from table where fieldname between #" & calendarfromdate & "# and #" & calendartodate & "#")
        end sub
        

        从打开的表单中,我有一个按钮,当点击并执行我需要的代码时,它会调用这个子。

        private sub btn_callqry_click()
         call nameofsub(calendarfromdate,calendartodate)
        end sub
        

        无需在打开的表单类的开头公开calendarfromdate和calendartodate的值,例如:

         public calendarfromdate as string
        

        public calendartodate 作为字符串

        注意:如果使用上面的例子,字符串必须格式化为 mm/dd/yyyy

        注意:如果您的表单包含在 Windows XP 中使用 Access 时发现的日历控件对象,则该日历对象在 Windows 7 上不存在,最好的选择是取出日历对象并放入两个标有标签的文本框中作为 FromDate 和 ToDate 并将它们的属性更改为将文本格式化为“日期”。这样做会在输入时自动在框旁边显示一个日期选择器。

        【讨论】:

          猜你喜欢
          • 2018-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          相关资源
          最近更新 更多