Question Displaying MdiChild ToolStrip into MdiParent during runtime.

priyamtheone

Well-known member
Joined
Sep 20, 2007
Messages
96
Programming Experience
Beginner
I have an MDI application containing an MdiParent form and few MdiChild forms. The MdiParent has a fixed MenuStrip, a fixed ToolStrip and a fixed StatusStrip. The MdiChild forms have one or more ToolStrips and a StatusStrip along with other controls in them. The ToolStrips and the StatusStrip of the MdiChild are generally hidden and are only shown when the form is opened in the MdiParent. Based on this scenario I have the following objectives:

1) When an MdiChild is opened in the parent, its ToolStrip(s) should be shown along with the fixed Menu and ToolStrip of the parent. Please note, I ?m not talking about merging the ToolStrip of the child form to that of the parent. It should show the ToolStrip of the child below the fixed ones of the parent. However, the StatusStrip of the child should merge with that of the parent as usual.

2) When an MdiChild is closed, its ToolStrip(s) should be removed from the MdiParent. The StatusStrip should also be unmerged from that of the parent.

3) As multiple Mdi children can be opened, the ToolStrip(s) of the currently active MdiChild should be shown in the MdiParent and those of the child losing focus should be removed as usual. The same rule is applicable for the StatusStrips also.

What I tried to do is, take a ToolStripPanel in the MdiParent and place the fixed Menu and ToolStrip in it. Then, when the MdiChild is opened or gains focus, add its toolstrip(s) into the ToolStripPanel of the parent. Later when the form loses focus or is closed, remove its toolstrip(s) from the ToolStripPanel of the parent.

The handling of the StatusStrips is typically done by the Merge and RevertMerge methods of ToolStripManager class when the child form opens/gains focus and closes/loses focus respectively.

The relevant code example for one of the child forms follows:

VB.NET:
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

VB.NET:
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

But the problem is, every time I try to close an MdiChild an ObjectDisposedException is thrown stating ?Cannot access a disposed object. Object name: ?Icon??. The problem doesn?t arise while traversing through the various MdiChild forms. It doesn?t arise while closing the whole application also.

Also, I couldn?t find a way to unjoin items from a ToolStripPanel.

Please help in solving this problem. Also mention if there?s some better way to achieve the above three objectives.

Feel free to ask if I couldn?t make myself clear.

Regards!
 
To "unjoin" just add it back to the child form on Deactivate, it can only have one parent:
Me.Controls.Add(Me.ToolStrip1)
 
It works for me.
 
Well, I tried it in both ways, appending it to the last line of the Deactivate event along with my code that I posted above and, deleting my one and keeping only yours. Still the same problem occurs. Can you please show how you are doing it?
 
I put that one line of code I posted in Deactivate event handler. That's it and that's all.
 

Latest posts

Back
Top