Vb.net 如何向其他过程传递/引用表单类参数

Vb.net 如何向其他过程传递/引用表单类参数,vb.net,forms,class,parameter-passing,Vb.net,Forms,Class,Parameter Passing,我有两张表格:街道和地址 我想在它们中定义一个具有相同名称的变量,这样当我从过程中调用任何一种形式时,无论调用的是哪种形式,我都可以使用该变量 例如,街道形状如下所示 Public Class Street Public ID As Integer = 0 Private Sub LoadForm() Dim myID As integer = ID End Sub End Class 地址表如下所示: Public Class Address Public I

我有两张表格:街道和地址 我想在它们中定义一个具有相同名称的变量,这样当我从过程中调用任何一种形式时,无论调用的是哪种形式,我都可以使用该变量

例如,街道形状如下所示

Public Class Street

  Public ID As Integer = 0

  Private Sub LoadForm()
    Dim myID As integer = ID
  End Sub

End Class
地址表如下所示:

Public Class Address

  Public ID As Integer = 0

  Private Sub LoadForm()
    Dim myID As integer = ID
  End Sub

End Class
Module Caller

  Public Sub Address(ByVal frm As Form)
    '...several codes here
    If IamHappy Then
      frm.ID = 2'this is illegal because ID is not part of form parameters
    Else
      frm.ID = 3'this is illegal because ID is not part of form parameters
    End if
    frm.show()
  End Sub

End Module
我的ParentMDI菜单将是:

Private Sub AddressClick()
  Call Address(Address)
End Sub

Private Sub StreetClick()
  Call Address(Street)
End Sub
具有打开表单过程的模块如下所示:

Public Class Address

  Public ID As Integer = 0

  Private Sub LoadForm()
    Dim myID As integer = ID
  End Sub

End Class
Module Caller

  Public Sub Address(ByVal frm As Form)
    '...several codes here
    If IamHappy Then
      frm.ID = 2'this is illegal because ID is not part of form parameters
    Else
      frm.ID = 3'this is illegal because ID is not part of form parameters
    End if
    frm.show()
  End Sub

End Module
基本上,我不希望菜单做“繁重的工作”,因为表单可以从几个不同的菜单/源调用。我希望模块中的公共过程在打开之前负责为表单参数赋值

我已经看到了关于如何将类作为参数发送的讨论,但这无助于我获取表单类中声明的值“ID”。我在想,有没有一种方法可以创建我自己的变量,使其成为我表单的一部分?或任何适合实现这一目标的方法

编辑以提供更多信息

  • 一个单独的登录过程将为我设置一个公共用户ID
  • MDI菜单应该告诉我用户登录后想要打开哪个表单
  • 调用者模块被假定为组合所使用表单的信息 已请求和用户的ID
  • a) 在打开表单之前设置表单的状态,例如,如果表单标签=2,则不要为此用户打开表单(我在这里没有问题),b)使用调用方模块设置表单的状态,然后继续打开表单。这就是问题所在。例如,我想将printID设置为1=用户可以打印;或2,用户不应打印
  • 我想管理4。b) 在公开声明的模块中,而不是在菜单中,或者在特定的表单中,因为我在这个应用程序中有许多表单

    除非有更好的方法来解决这个问题,而不是我如何处理它


    谢谢。

    System.Windows.Forms.Form没有ID属性。当您调用Address Sub时,您正在将
    Address
    Street
    表单转换回简单表单。您可以编写一个带有ID的基类表单,并从中继承地址和街道,然后:

      Public Sub Address(ByVal frm As MDIChildBase)
    
    或者您可以使用重载:

      Public Sub Address(ByVal frm As Address)
    
      Public Sub Address(ByVal frm As Street)
    
    这将产生更多的代码,这似乎是您试图避免的

    或者将
    frm
    变量转换回类型,前提是您可以确定需要哪一个:

      Public Sub Address(ByVal frm As Form)
        '...several codes here
        If ICanTellWhichIsWhich Then
          CType(frm, Address).ID = 2
    
    这些都不理想。一般来说,最好让一个类来管理所有这些内容,该类将实际引用所涉及的表单,并知道要做什么以及如何做。表单中的程序逻辑越少越好


    但是,您似乎也在使用表单的默认实例:

    Private Sub AddressClick()
      Call Address(Address)
    End Sub
    
    表单是类,因此应显式实例化:

    Dim frmA As New Address
    ...
    frmA.Show 
    ...
    Call Address(frmA)
    

    谢谢我从你的帖子中得到了一些想法,我目前正在尝试。特别是创建基类表单。我不知道如何实现重载。但是第三个建议,正确地说,是我试图避免的——我可以有很多种形式!表单基类的问题是需要编译它,以便IDE获取属性。如果一个类引用了表单
    frmAddr As Address
    你可以引用任何你想引用的东西,而无需特别的步骤。我正在尝试的东西撞到了一堵墙。那么我如何用一个类来实现这一点呢?我无法建立连接,因为我只知道如何创建独立于表单的类。让我更详细地解释一下我想做什么,以便你能帮上忙。ID用于检查用户是否具有打印数据的权限。如果ID=1,则表单中的打印按钮将被禁用。因此,我需要一种外部方法来在每个表单打开之前设置该ID的值。我现在使用tag,但一次只能使用一个变量,因此不灵活。