我有一个 MDI 应用程序,其中包含一个 MdiParent 表单和几个 MdiChild 表单。MdiParent 有一个固定的 MenuStrip、一个固定的 ToolStrip 和一个固定的 StatusStrip。MdiChild 表单具有一个或多个 ToolStrips 和一个 StatusStrip 以及其中的其他控件。MdiChild 的 ToolStrips 和 StatusStrip 一般是隐藏的,只有在 MdiParent 中打开窗体时才会显示。基于这种情况,我有以下目标:
1) 当 MdiChild 在父级中打开时,它的 ToolStrip(s) 应与父级的固定菜单和 ToolStrip 一起显示。请注意,我不是在谈论将子窗体的 ToolStrip 合并到父窗体的 ToolStrip。它应该在父项的固定项下方显示子项的 ToolStrip。但是,子节点的 StatusStrip 应该像往常一样与父节点的状态条合并。
2) 当一个 MdiChild 关闭时,它的 ToolStrip(s) 应该从 MdiParent 中移除。StatusStrip 也应该从父级中取消合并。
3) 由于可以打开多个 Mdi 子项,当前活动的 MdiChild 的 ToolStrip(s) 应显示在 MdiParent 中,失去焦点的子项应照常删除。同样的规则也适用于 StatusStrips。
我试图做的是,在 MdiParent 中取一个 ToolStripPanel 并将固定的 Menu 和 ToolStrip 放入其中。然后,当 MdiChild 打开或获得焦点时,将其工具条添加到父级的 ToolStripPanel 中。稍后当窗体失去焦点或关闭时,从父级的 ToolStripPanel 中删除其工具条。
当子窗体分别打开/获得焦点和关闭/失去焦点时,StatusStrips 的处理通常由 ToolStripManager 类的 Merge 和 RevertMerge 方法完成。
其中一个子表单的相关代码示例如下:
Private Sub CustomerList_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
If Not MdiParent Is Nothing Then
Dim parent As Home = MdiParent
Dim lastIndex As Integer = Array.IndexOf(parent.ToolStripPanel1.Rows, parent.ToolStripPanel1.Rows.Last)
parent.ToolStripPanel1.Join(Me.ToolStrip1, lastIndex + 1)
Me.ToolStrip1.Visible = True
ToolStripManager.Merge(Me.StatusStrip1, CType(Me.MdiParent, Home).StatusStrip1)
End If
End Sub
Private Sub CustomerList_Deactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Deactivate
If Not MdiParent Is Nothing Then
Dim parent As Home = MdiParent
Dim lastIndex As Integer = Array.IndexOf(parent.ToolStripPanel1.Rows, parent.ToolStripPanel1.Rows.Last)
Array.Clear(parent.ToolStripPanel1.Rows, lastIndex, 1)
parent.ToolStripPanel1.Controls.RemoveAt(lastIndex)
ToolStripManager.RevertMerge(CType(Me.MdiParent, Home).StatusStrip1, Me.StatusStrip1)
End If
End Sub
但问题是,每次我尝试关闭 MdiChild 时都会抛出 ObjectDisposedException 说明“无法访问已处置的对象。对象名称:“图标””。遍历各种 MdiChild 表单时不会出现问题。关闭整个应用程序时也不会出现。
此外,我找不到从 ToolStripPanel 中取消连接项目的方法。
请帮助解决这个问题。还要提到是否有更好的方法来实现上述三个目标。
随意问我是否不能说清楚。
问候!