10

那么如何将值从一种形式传递到另一种形式?例如:用户从列表中选择一个组织,这将打开一个旅行表单,允许用户输入有关旅行的各种信息。在一个地方,我想添加另一个小的弹出表单,他们可以在其中输入他们正在访问的组织的联系信息(只是 POC 的名称和电话)。

因此,当从选择屏幕打开初始表单时,它有两个隐藏在文本框中的 ID(一个是 tripID,另一个是 OrgID),那么我如何将这些传递给第二个小弹出表单,以便联系信息具有与之相关的 ID。

谢谢。

4

3 回答 3

18

在这些情况下,最好的方法是不要尝试传递一堆变量。代码太多,不灵活。例如,如果您需要传递两个值,那么多年来当该要求增加到 5 个值时会发生什么?试图维护和传递一个完整的值是太多的编码工作。

请记住,ms-access 中的每个表单实际上都是一个可以在代码中操作的类对象。因此,在这里使用对象方法,您会发现您不仅编写更少的代码,而且您的代码会更干净、更模块化,不需要全局变量,并且您编写的代码通常可以在不同的形式之间重用。

方法如下:

通常,当一个表单在表单打开事件中以第二个表单启动另一个表单时(实际上,您甚至可以在加载事件时使用),您可以获取对 PREVIOUS 表单对象的引用。换句话说,您可以在这里使用对象方法。

在表单模块级别,对于表单,我将表单对象声明为:

Option Compare Database
Option Explicit 
dim frmPrevious       as form 

然后,在表单加载事件中,我们去:

Set frmPrevious = Screen.ActiveForm

现在,我们表单中的任何代码都可以自由地使用代码、事件,甚至是在代码中从之前的表单声明为公共的变量。

所以,如果你想强制以前形式的磁盘写入,并重新加载数据。

frmPrevious.Refresh

如果要设置 ID 值,请执行以下操作:

frmPrevious!ID = some value

并且,请注意,您甚至可以将 form previous 声明为该表单的 PUBLIC 变量,因此如果您有两个表单,您可以:

frmPrevious.frmPrevious!ID = some value

因此,只需在每个表单代码模块(或至少在您需要在代码中使用值的那些)中声明一个表单对象。以上意味着任何代码都有对前一个表单对象的现成引用。在表单中声明为 public 的函数将成为表单的 METHOD,并且可以像这样运行:

frmPrevious.MyCustomRefresh

甚至诸如强制以前的表单生成和设置发票编号的选项之类的东西:

frmPrevous.SetInvoice

或者

frmPrevious.SetProjectStatusOn

因此,您不仅可以来回打乱值和数据,还可以轻松地执行在代码中为前一个表单构建的特性和函数。

事实上,作为一种编码标准,我的大多数表单都有一个名为MyRefresh.

请注意,这种方法的美妙之处在于您可以从以前的表单中读取 + 使用 + 设置值。这使您的代码不仅可以接收值,还可以在以前的形式中设置值。所以这种方法是双向的。您可以在表单之间来回移动数据和值。这里的另一个优点是您不仅可以使用变量,还可以使用字段、控制值(事件、属性)等。

这种方法意味着以前的大部分表格现在都触手可及。

所以不要试图传递一大堆变量。传递对表单的引用,您就可以轻松获得一个漂亮的现成对象,它使这种类型的编码问题变得轻而易举。

于 2009-09-23T08:02:42.120 回答
6

通常的方法是从弹出表单中引用初始表单中的文本框,如下所示:

Forms!frmInitialForm!tripID
Forms!frmInitialForm!OrgID

但是,这将弹出表单紧密绑定到初始表单,因此它不能在应用程序的其他任何地方使用。

更好的方法是使用 OpenArgs:

DoCmd.OpenForm "frmPopup", OpenArgs:=Me.tripID & ", " & me.OrgID

这会将您的两个值放入一个字符串中,该字符串将传递给弹出表单。然后,您可以使用 Split 函数从 OpenArgs 中解析出这两个值。

有关使用 OpenArgs 传递参数的更多信息,请参阅: http ://www.fmsinc.com/free/NewTips/Access/accesstip13.asp

于 2009-09-22T22:36:32.647 回答
1

这个可以帮助

MS Access:将参数从一种访问形式传递到另一种访问形式

于 2009-09-23T07:13:52.373 回答