如何动态访问所有者表单的成员

时间:2016-06-04 11:49:08

标签: vb.net winforms class

在Winforms应用程序中,请考虑以下Form Class:

Public Class frmOwner
    Public MyProperty As String = "Test"
    Private Sub btnShowDialog_Click(sender As Object, e As EventArgs) _
                                    Handles btnShowDialog.Click
        Using frm As New frmDialog
            frm.ShowDialog(Me)
        End Using
    End Sub
End Class

现在,每当我想从对话框表单中访问MyProperty时,我就会使用以下内容:

    MessageBox.Show(DirectCast(Me.Owner, frmOwner).MyProperty)  'Test

到目前为止一切顺利。 问题来自我有另一个表单(例如frmOwner2),该表单也有成员MyProperty,并且还显示frmDialog的实例。

我的问题是:我如何确定-from frmDialog - 哪个表单是所有者才能访问其公共成员?

1 个答案:

答案 0 :(得分:2)

如果要从对话框中获取所有者的某些公共属性,但所有者可能是不同的类,那么您可以选择两种不同的方法: 1。,类继承2.,实现接口。

在这两种情况下,您都会转换为相应的父级或接口,然后调用该对象的属性名称。

另一种方法可能是使用 Reflection ,但在你的情况下,这将是一个加农炮对抗小鸟

1.,类继承

您可以在父表单中定义您希望的公共属性。然后使用Inherits ParentForm指令从该父项派生其他表单。

Public Class frmOwnerBase

  Protected _MyProperty1 As String
  Public Property MyProperty1() As String
    Get
      Return _MyProperty1
    End Get
    Set(ByVal value As String)
      _MyProperty1 = value
    End Set
  End Property

  Protected _MyProperty2 As String
  Public Property MyProperty2() As String
    Get
      Return _MyProperty2
    End Get
    Set(ByVal value As String)
      _MyProperty2 = value
    End Set
  End Property

End Class

然后在frmOwner1.Designer.vb和frmOwner2.Designer.vb文件中重写祖先:

Partial Class frmOwner1
  Inherits frmOwnerBase

Partial Class frmOwner2
  Inherits frmOwnerBase

2.,接口实现

您可以在界面中定义属性的类型和名称。然后在frmOwnerfrmOwner2类中,您在其声明中应用Implements InterfaceName。然后使用指令Public MyProperty As String Implements InterfaceName.MyProperty

定义您的属性
Public Interface InterfaceOwner

  Property MyProperty1() As String

  Property MyProperty2() As String

End Interface
Public Class frmOwner
  Implements InterfaceOwner
  Private _MyProperty1 As String
  Public Property MyProperty1() As String Implements InterfaceOwner.MyProperty1
    Get
      Return _MyProperty1
    End Get
    Set(ByVal value As String)
      _MyProperty1 = value
    End Set
  End Property

  Private _MyProperty2 As String
  Public Property MyProperty2() As String Implements InterfaceOwner.MyProperty2
    Get
      Return _MyProperty2
    End Get
    Set(ByVal value As String)
      _MyProperty2 = value
    End Set
  End Property

End Class