Как вызвать метод mdichildA, который вызывает метод mdichildB из mdiparent - PullRequest
0 голосов
/ 03 марта 2020

У меня есть MDIParent форма, содержащая предыдущие и следующие кнопки на панели инструментов. MDIChildA содержит DataGridView, а формы MDIChildB или MDIChild C отображают свойства выбранной строки в зависимости от типа строки. Все дочерние MDI-формы отображаются с помощью DocStyle.Fill.

Цель состоит в том, чтобы предыдущие и последующие кнопки вызывали методы в MDIChildA, а MDIChildA - для ссылки sh либо MDIChildB, либо MDIChild C для следующего Строка DataGridView в зависимости от типа строки.

Форма MDIChild C была недавно введена, когда в DataGridView был включен элемент второго типа. Предыдущая и следующая функции работали, когда был только один тип строки. Вот как было закодировано следующее:

В 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 и сохранил его ) Мне кажется, что я больше не могу использовать подход ActiveMDIChild.

Кто-нибудь может предложить подход?

1 Ответ

0 голосов
/ 03 марта 2020

Поскольку MDIChildA имеет определенную цель c (показывает сетку) и предоставляет информацию для других форм (MDIChildB или MDIChild C), вы можете просто сохранить ссылку на экземпляр MDIFormA в MDIParent (private childA AS MDIChildA) , Затем в вашем tsbNext_Click вы можете вызвать функцию publi c для childA (экземпляр MDIChildA), чтобы вернуть информацию о выбранной строке, которая впоследствии может быть передана в MDIChildB или MDIChild C, et c ,

В 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 или MDIChild C:

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