如何调用从 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
我有一个 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