首页 > 解决方案 > 如何调用从 mdiparent 调用 mdichildB 方法的 mdichildA 方法

问题描述

我有一个 MDIParent 表单,其中包含工具栏中的上一个和下一个按钮。MDIChildA 包含一个 DataGridView,而 MDIChildB 或 MDIChildC 窗体根据行类型显示选定行的属性。所有 MDI 子窗体都显示为 DocStyle.Fill。

目标是让上一个和下一个按钮调用 MDIChildA 中的方法,并让 MDIChildA 根据行类型为下一个 DataGridView 行刷新 MDIChildB 或 MDIChildC。

当 DataGridView 中包含第二种类型的项目时,最近引入了 MDIChildC 表单。当只有一种行类型时,上一个和下一个功能正在工作。以下是 next 的编码方式:

在 MDIParent 中:

    Private Delegate Sub InvokePrevNext()

    Private Sub tsbNext_Click(sender As Object, e As EventArgs) Handles tsbNext.Click
        Try
            If Not ActiveMdiChild Is Nothing Then
                Dim frm As Object
                frm = Me.ActiveMdiChild
                Dim dlg As InvokePrevNext = AddressOf frm.MoveNext
                dlg.Invoke()
            End If

        Catch ex As Exception
            ' ignore exceptions
        End Try
    End Sub

在 MDIChildB 中:

    Public Sub MoveNext()
        Call psMovePreviousNext(pMDIChildA.NextRowPrimaryKey)
    End Sub

(最初调用 MDIChildB 时,它接收 MDIChildA ByRef 并保存其指针。)

既然存在 MDIChildC 表单,我需要重新定向控制,以便 MDIChildA 通过确定下一个行类型并刷新适当的子项来处理下一个请求。在我看来,我不能再使用 ActiveMDIChild 方法。

任何人都可以提出一种方法吗?

标签: vb.netmdi

解决方案


由于 MDIChildA 具有特定用途(显示网格)并为其他表单(MDIChildB 或 MDIChildC)提供信息,因此您可以只保留对 MDIParent 中 MDIFormA 实例的引用(私有 childA AS MDIChildA)。然后在tsbNext_Click你可以调用childA(MDIChildA 的实例)上的公共函数,以返回选定的行信息,随后可以将其传递给 MDIChildB 或 MDIChildC 等。

在 MDIParent 中:

Private childA As MDIChildA 'assigned when MDIChildA is loaded/shown
Private childB As MDIChildB 'assigned when MDIChildB is loaded/shown
Private childC As MDIChildC 'assigned when MDIChildC is loaded/shown

Private Sub tsbNext_Click(sender As Object, e As EventArgs) Handles tsbNext.Click
    Try
        If childA IsNot Nothing Then
            Dim nextRow = childA.GetNextRow()
            If nextRow = [you know what goes here, I dont] Then
                childB.FillData(nextRow)
            Else
                childC.FillData(nextRow)
            End If
        End If

    Catch ex As Exception
        ' Ignoring exceptions is not recommended 
        ' because it makes it hard to support your app
        ' You are better-off logging it. Check out Log4Net 
    End Try
End Sub

在 MDIChildA 中:

Public Function GetNextRow() As String 'or DataRow or enum or something
    'code to pick the next row
    return me.NextRowPrimaryKey
End Sub

在 MDIChildB 或 MDIChildC 中:

Public Sub MoveNext(nextRow As String) 'or Long or DataRow, etc.
    'code for processing the nextrow
End Sub

推荐阅读