表格中的问题已激活和取消激活事件

时间:2011-04-03 16:13:45

标签: .net vb.net winforms .net-4.0

方案

这是一个非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事件完成的,而是在btnForm3_Click中引发以这种形式声明的朋友事件,该事件在frmHome中处理。 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

所有四种形式的工具条按钮中都有“添加”,“编辑”和“删除”按钮,这些按钮对所有这些按钮都是通用的。他们的菜单项中也有“文件”菜单。

目标

将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_Deactivate事件中来完成。但是,当您在frmHome.Panel1中打开表单时,此处既没有激活也没有激活Deactivate事件。您可以使用Form_Load和Form_FormClosed事件代替Activated和Deactivate,但如果在面板中打开新表单之前关闭现有表单,它们将仅合并/取消合并菜单。但是,由于我有时需要打开和关闭表单以保持打开现有表单,因此使用这些事件将无法完成任务。即使是GotFocus和LostFocus事件也无济于事。因此,我希望激活Activated和Deactivate事件,或者在表单获得/失去焦点时,可以通过其他方式合并/取消合并菜单和工具条。这真让我抓狂。我根本找不到出路。请帮忙。问候。

1 个答案:

答案 0 :(得分:0)

好的,我已经完成了它,我的结论是,处理这个的最好方法是使用splitcontainer的ControlAdded和ControlRemoved事件来检查当前添加/删除的控件,并合并/取消合并该控件的工具条w.r.t. Home表单工具条。只需编写一个全局方法来合并/取消合并工具条与控件名称的参数(将在splitcontainer中添加/删除的控件)。在ControlAdded和ControlRemoved事件中,使用子控件作为参数调用该方法。将我在OP中提到的子表单重构为UserControls可以改善性能,但在某些情况下它们不符合我的要求,例如:当在splitcontainer中打开Subform1并立即打开Subform3而不关注SubForm1的任何其他控件时(假设通过单击SubForm1上的工具条按钮),不会发生取消合并,因为不会触发像LostFocus,Leave等事件。这会在菜单中产生歧义。所以我将选择Splitcontainer ControlAdded / ControlRemoved事件。但不是打开窗体作为子控件,我将从此使用UserControls。 我最后会提出一个小问题。如何从SplitContainer面板关闭UserControl?直到现在我正在使用:

frmSubForm1.Close()
frmSubForm1=Nothing

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

如果需要,可以随意继续使用您的建议。