在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
- 哪个表单是所有者才能访问其公共成员?
答案 0 :(得分:2)
如果要从对话框中获取所有者的某些公共属性,但所有者可能是不同的类,那么您可以选择两种不同的方法: 1。,类继承2.,实现接口。
在这两种情况下,您都会转换为相应的父级或接口,然后调用该对象的属性名称。
另一种方法可能是使用 Reflection ,但在你的情况下,这将是一个加农炮对抗小鸟。
您可以在父表单中定义您希望的公共属性。然后使用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
您可以在界面中定义属性的类型和名称。然后在frmOwner
和frmOwner2
类中,您在其声明中应用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