如何调用从 mdiparent 调用 mdichildB 方法的 mdichildA 方法

How to invoke an mdichildA method that invokes an mdichildB method from mdiparent

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

objective 用于上一个和下一个按钮调用 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 方法了。

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

由于 MDIChildA 具有特定用途(显示网格)并为其他形式(MDIChildB 或 MDIChildC)提供信息,因此您可以在 MDIParent 中保留对 MDIFormA 实例的引用(private childA AS MDIChildA)。然后在您的 tsbNext_Click 中,您可以在 childA (MDIChildA 的一个实例)上调用 public 函数,以 return 选定的行信息,该信息随后可以传递给 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