阻止其所有者的非模态形式

时间:2013-10-16 16:58:29

标签: vb.net

我正在尝试为我的项目获取符合我需求的表单配置here并且没有找到解决方案。似乎我找到了一个解决方案,现在我必须在应用程序范围内实现它。

这里我有主要表格和一些子表格(有很多子表格),通过主表格我应该始终能够关闭所有打开的表格,注意通用按键,永久关闭应用程序并观察重要事件。

我在这个事实中找到了解决方案:

  • 从主窗体我打开实例化但非模态的主要子窗体。
  • 从子表单中打开更深层的子表单,也是实例化和非模态的 在所有这些子表单中_Load事件处理程序我禁用调用表单并在_FormClosing处理程序中我再次启用它。那样非模态形式就像模态形式一样,以便调用者,但不是为了保持始终响应的主要形式!

在必须阻止自己的调用者(所有者)的表单中,我添加了属性“阻止”,以便我的代码如下所示:

If Not formIsOpened(frm_myFirstChild) Then
    Dim f As New frm_myFirstChild
    f.Blocking = True
    f.Show(Me)
    f = Nothing
End If

在frm_myFirstChild我有财产:

<Browsable(True), _
 DefaultValue(False)> _
Public Property Blocking() As Boolean
    Get
        Return _Blocking
    End Get
    Set(ByVal value As Boolean)
        _Blocking = value
    End Set
End Property

如果布尔属性“阻止”为TRUE,则在_Load下必须执行此代码:

If Blocking And Me.Owner IsNot Nothing Then
   Me.Owner.Enabled = False
End If

_FormClosing中:

If Blocking And Me.Owner IsNot Nothing Then
   Me.Owner.Enabled = True
   Me.Owner.Activate()
End If

所有这些都按预期工作,所以我尝试为所有表单实现它,并在子类“cls_transform”中需要时使用:

Protected Overrides Sub OnFormClosing(ByVal e As System.Windows.Forms.FormClosingEventArgs)
    If Blocking And Me.Owner IsNot Nothing Then
        Me.Owner.Enabled = True
        Me.Owner.Activate()
    End If
    MyBase.OnFormClosing(e)
End Sub

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
    If Blocking And Me.Owner IsNot Nothing Then
        Me.Owner.Enabled = False
    End If
    MyBase.OnLoad(e)
End Sub

这里我有一个问题,即子类不理解属性Blocked(未声明)。

如何将Form的属性Blocked添加到子类中,以便我可以将这些子类用于所有表单,并从外部切换属性Blocking以了解功能需求?

1 个答案:

答案 0 :(得分:1)

听起来“cls_transform”实际上是一个派生自Form的类,这是OnFormClosing可以工作的唯一方式。哪个没关系,你的“子表单”现在需要从cls_transform而不是Form派生。选择一个更好的名字。

然后只需将Cling属性添加到该cls_transform类即可解决您的问题。

请注意您的OnFormClosing方法中存在错误。它可以被取消,这将使表单在其所有者处于错误状态时打开。你需要这样写:

Protected Overrides Sub OnFormClosing(ByVal e As System.Windows.Forms.FormClosingEventArgs)
    MyBase.OnFormClosing(e)
    If Not e.Cancel And Blocking And Me.Owner IsNot Nothing Then
        Me.Owner.Enabled = True
        Me.Owner.Activate()
    End If
End Sub