如果孩子只是表格的副本,如何检测MDIChild?

时间:2015-09-01 01:08:58

标签: vb.net mdi

我有frm_Childfrm_Parent,我将isMDIContainer的{​​{1}}设置为frm_Parent

在frm_Parent中我有2个按钮

  1. true - 创建另一个btn_Create
  2. mdi child - 检测有效btn_Detect mdi Child
  3. 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_variablefrm_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

    ,则为屏幕截图

    enter image description here

    问题:如何以编程方式检测活动的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
    

2 个答案:

答案 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,那么你要么必须进行额外的检查并转换为正确的类型,要么使用接口,所有的孩子都会实现并转向。