表单激活和停用事件中的问题



场景

这是一个非MDI窗口应用程序。我有一个主页表单,其中包含一个名为Panel1的面板和两个按钮btnForm1和btnForm2。单击btnForm1和btnForm2分别在Panel1中打开Form1和Form2。在Panel1中打开表单之前,Panel1中所有打开的表单都将被清除。代码如下:

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

在Form1中有一个按钮btnForm3,它可以在Form2上方的frmHome.Panel1中打开Form3,而不会清除Panel1中的任何现有表单。这不是由btnForm3_Click事件直接完成的,而是在frmHome中处理的btnForm3_Click中引发了在此表单中声明的朋友事件。frmHome中处理它的代码如下:

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

这四个表单的工具栏按钮中都有"添加"、"编辑"one_answers"删除"按钮,这些按钮对所有表单都是通用的。他们的菜单项中还有文件菜单,这些菜单项对他们来说是通用的。

目标

将frmHome.Panel1中当前活动窗体的菜单和工具栏合并到frmHome的菜单和任务栏。要取消合并frmHome中当前活动窗体的菜单和工具栏。当面板被停用。这可以通过在frmHome.Panel1:中打开的表单中包含以下行来处理

合并

ToolStripManager.Merge(Me.MenuStrip1, frmHome.MenuStrip1)
ToolStripManager.Merge(Me.ToolStrip1, frmHome.ToolStrip1)

取消合并

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

问题

上面的几行应该写在哪些事件中?在MDI应用程序中,这可以通过将它们分别包含在Form_Activated和Form_Dactivate事件中来实现。但在这里,当你在frmHome.Panel1中打开表单时,激活或停用事件都不会触发。您可以使用Form_Load和Form_FormClosed事件,而不是Activated和Deactivate,但如果在面板中打开新表单之前关闭了现有表单,它们只会合并/取消合并菜单。但是,由于我有时需要打开和关闭表单以保持现有表单的打开,因此使用这些事件无法完成任务。即使是GotFocus和LostFocus事件也不会起作用。因此,我希望触发Activated和Deactivate事件,或者通过其他方式,当窗体分别获得/失去焦点时,可以合并/取消合并菜单和toolstrip。这简直把我逼疯了。我根本找不到出路。请帮忙。当做

好的,我已经处理过了,我的结论是,处理这个问题的最好方法是使用splitcontainer的ControlAdded和ControlRemoved事件来检查当前添加/删除了哪个控件,并将该控件的toolstrip与主窗体toolstrip合并/取消合并。只需编写一个全局方法来合并/取消合并带有控件名称参数的toolstrip(将在splitcontainer中添加/删除的控件(。在ControlAdded和ControlRemoved事件中,调用以子控件为参数的方法。将我在OP中提到的子窗体重构为UserControls提高了性能,但在某些情况下,它们不能满足我的要求。例如,当在splitcontainer中打开Subform1,并从中立即打开Subform3,而不关注Subform1的任何其他控件时(假设通过单击Subform1上的toolstrip按钮(,取消合并不会像LostFocus这样发生,休假等不被解雇。这会在菜单中产生歧义。因此,我将选择SplitContainerControlAddd/ControlRemoved事件。但是,我以后将使用UserControls,而不是将窗体作为子控件打开。最后我会提出一个小问题。如何从SplitContainer面板关闭UserControl?到目前为止,我使用的是:

frmSubForm1.Close()
frmSubForm1=Nothing

但是UserControls没有任何Close((方法。

如果需要的话,可以继续这个话题,提出你的建议。

最新更新