Click here to Skip to main content
15,890,366 members
Please Sign up or sign in to vote.
3.50/5 (4 votes)
See more:
Scenario
This is a non-MDI windows application.
I have a home form containing a panel named Panel1 and two buttons btnForm1 and btnForm2. Clicking btnForm1 and btnForm2 opens up Form1 and Form2 respectively in Panel1. Before a form is opened in Panel1, all opened forms in Panel1 are cleared. The code follows:
Private objForm1 As Form1
Private Sub btnForm1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm1.Click
    objForm1 = New Form1
    objForm1.FormBorderStyle = Windows.Forms.FormBorderStyle.None
       objForm1.TopLevel = False
       objForm1.Dock = DockStyle.Fill
    Panel1.Controls.Clear
    Panel1.Controls.Add(objForm1)
    objForm1.Show()
End Sub

Private Sub btnForm2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnForm2.Click
    Dim objForm2 As New Form1
    objForm2.FormBorderStyle = Windows.Forms.FormBorderStyle.None
       objForm2.TopLevel = False
       objForm2.Dock = DockStyle.Fill
    Panel1.Controls.Clear
    Panel1.Controls.Add(objForm2)
    objForm2.Show()
End Sub


In Form1 there's a button btnForm3 that opens up Form3 in frmHome.Panel1 just above Form2 without clearing any existing forms in Panel1. This is not done by
btnForm3_Click event directly, rather a friend event declared in this form is raised in btnForm3_Click which is handled in frmHome. The code in frmHome to
handle it follows:
Private Sub objForm1_LoadForm3InHome() Handles objForm1.LoadSubForm3InHome
    Dim objForm3 As New Form3
    objForm3.FormBorderStyle = Windows.Forms.FormBorderStyle.None
       objForm3.TopLevel = False
       objForm3.Dock = DockStyle.Fill
       Panel1.Controls.Add(objForm3)
       objForm3.Show()
       objForm3.BringToFront()
End Sub


All the four forms have Add, Edit and Delete buttons among their toolstripbuttons that are common to all of them. They also have File menu among their
menuitems that are common to them.

Objective
To merge the menu and toolstrip of the currently active form in frmHome.Panel1 to the menu and toolstrip of frmHome. To unmerge the menu and toolstrip of the currently active form in frmHome.Panel1 from the menu and toolstrip of frmHome when the active form of the panel is deactivated. This can be handled by including the undermentioned lines in the form that will open in frmHome.Panel1:
To merge
ToolStripManager.Merge(Me.MenuStrip1, frmHome.MenuStrip1)
ToolStripManager.Merge(Me.ToolStrip1, frmHome.ToolStrip1)


To unmerge
ToolStripManager.RevertMerge(frmHome.MenuStrip1)
ToolStripManager.RevertMerge(frmHome.ToolStrip1)


Problem
In which events should the above lines be written?
In MDI apps this could have been accomplished by including them in Form_Activated and Form_Deactivate events respectively. But here neither Activated nor
Deactivate events fire when you open forms in frmHome.Panel1. Instaed of Activated and Deactivate you can use Form_Load and Form_FormClosed events but they will only merge/unmerge menus if existing forms are closed before opening a new form in the panel. But as I sometimes need forms to be opened and closed keeping existing forms opened, using these events won't fulfill the task. Even the GotFocus and LostFocus events won't work. So I want Activated and Deactivate events to be fired or some other means by which the menus and toolstrips can be merged/unmerged when the form gains/looses focus respectively. This is driving me crazy. I can't at all find a way out. Please help. Regards.
Posted

Ok, I worked on it and my conclusion is, the best way to handle this is to use the ControlAdded and ControlRemoved events of the splitcontainer to check which control is currently added/removed and merge/unmerge the toolstrip of that control w.r.t. the Home form toolstrip. Just write a global method to merge/unmerge the toolstrips with a parameter for the name of the control (the control that'll be added/removed in the splitcontainer). In the ControlAdded and ControlRemoved events, call the method with the child control as argument. Refactoring the subforms that I mentioned in the OP to UserControls improved performance but in certain cases they don't fulfill my requirement e.g. when Subform1 is opened in the splitcontainer and Subform3 is opened immediately from it without focusing on any other control of SubForm1 (suppose by clicking a toolstripbutton on SubForm1), unmerging doesn't occur as events like LostFocus, Leave etc are not fired. This creates ambiguity in the menus. So I'll go for the Splitcontainer ControlAdded/ControlRemoved events. But instead of opening forms as child controls I'll henceforth use UserControls.
I'll drop a small question at the end. How'll I close the UserControl from the SplitContainer panel? Till now I was using:
frmSubForm1.Close()
frmSubForm1=Nothing

But UserControls don't have any Close() method.

Fell free to continue this thread further with your suggestions if needed.
 
Share this answer
 
I would probably suggest putting the merge/unmerge code in Panel1_ControlAdded and Panel1_ControlRemoved
 
Share this answer
 
Comments
priyamtheone 5-Apr-11 11:15am    
I'll give a try. The fact I came to know is the forms opening in the panel are not exactly behaving as forms, instead they behave as UserControls now. That's why the Activated and Deactivate events don't work. Refactoring them to UserControls may work. I'll try that too and get back soon.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900