我有frm_Child
和frm_Parent
,我将isMDIContainer
的{{1}}设置为frm_Parent
在frm_Parent中我有2个按钮
true
- 创建另一个btn_Create
mdi child
- 检测有效btn_Detect
mdi Child
frm_Parent代码:
(When I say active it means that I set my focused on it)
然后我有了frm_Child,并且Public Class frm_Parent
Public my_variable As String
Private Sub btn_create_Click(sender As Object, e As EventArgs) Handles btn_create.Click
my_variable += 1
Call New frm_Child() With {.MdiParent = Me}.Show()
End Sub
Private Sub btn_Detect_Click(sender As Object, e As EventArgs) Handles btn_Detect.Click
'Code to detect active mdi child
End Sub
End Class
内有label1.text
label1.text
的价值会自动获得form_load
,这完全取决于my_variable
对frm_Parent
的价值{1}}
frm_Child代码:
Public Class frm_Child
Private Sub frm_Child_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Label1.Text = frm_Parent.my_variable
End Sub
End Class
如果我创建4个新的frm_Child
,则为屏幕截图 问题:如何以编程方式检测活动的mdi子节点并将label1.text显示给messagebox? (note: active mean that I set my on it.)
我尝试过这样的事情,
Private Sub btn_Detect_Click(sender As Object, e As EventArgs) Handles btn_Detect.Click
'Code to detect active mdi child
Dim activeChild As Form = me.ActiveMdiChild
MsgBox(activeChild.label1.text)
End Sub
此外,我还修改了the example from MSDN
Private Sub btn_Detect_Click(sender As Object, e As EventArgs) Handles btn_Detect.Click
'Code to detect active mdi child
Dim activeChild As Form = Me.ActiveMdiChild
' If there is an active child form, find the active control, which
' in this example should be a RichTextBox.
If (Not activeChild Is Nothing) Then
Try
Dim theLabel As Label = CType(activeChild.ActiveControl, Label)
MsgBox(theLabel.Text)
Catch
MessageBox.Show("You need to select an active form.")
End Try
End If
End Sub
答案 0 :(得分:1)
因此,要总结答案中的注释,您需要通过父项的ActiveMdiChild
属性获取子表单并将其转换为适当的类型,以便能够访问该类型的成员
答案 1 :(得分:1)
就我个人而言,我认为你应该将“my_variable”值传递给你孩子表单的构造函数,但是按照jmcilhinney的建议 cast ,你应该像这(而不是使用默认实例):
Private Sub frm_Child_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim parent As frm_Parent = DirectCast(Me.MdiParent, frm_Parent)
Me.Label1.Text = parent.my_variable
End Sub
同样,这是你如何投射MdiChild并在“检测”按钮中抓取标签:
Private Sub btn_Detect_Click(sender As Object, e As EventArgs) Handles btn_Detect.Click
If Not IsNothing(Me.ActiveMdiChild) Then
Dim child As frm_Child = DirectCast(Me.ActiveMdiChild, frm_Child)
MessageBox.Show(child.Label1.Text)
End If
End Sub
当然,如果你要使用不同的类型的MdiChildren,那么你要么必须进行额外的检查并转换为正确的类型,要么使用接口,所有的孩子都会实现并转向。