在哪里控制 winform 右上角“X”关闭按钮的行为?
-
27-09-2019 - |
题
我正在尝试通过将某些表单设为无模式来使我的 VB.NET 应用程序更好用一些。
我想我已经弄清楚如何使用 dlg.Show() 和 dlg.Hide() 而不是调用 dlg.ShowDialog()。我的主应用程序表单中有一个无模式对话框的实例:
Public theModelessDialog As New dlgModeless
为了启动无模式对话框,我调用
theModelessDialog.Show()
并在“确定”和“取消”按钮处理程序中 dlgModeless
我有
Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click
Me.DialogResult = System.Windows.Forms.DialogResult.OK
Me.Hide()
End Sub
Private Sub Cancel_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel_Button.Click
Me.DialogResult = System.Windows.Forms.DialogResult.Cancel
Me.Hide()
End Sub
这似乎运作良好。
不过,右上角的“X”按钮让我很困惑。当我使用该按钮关闭表单,然后尝试重新打开该表单时,我得到
ObjectDisposeException 未处理。无法访问已处置的对象。
我觉得我已经完成了大部分工作,但我不知道如何执行以下任一操作:
- 隐藏“X”按钮
- 捕获该事件,这样我就不会处理该对象(就像我点击“取消”一样对待它)
有任何想法吗?
该对话框的类是 System.Windows.Forms.Form
.
解决方案
使用 Me.Close()
隐藏表单。要打开它,请使用以下代码片段:
If theModelessDialog.IsDisposed Then
theModelessDialog = New dlgModeless
End If
dlgModeless.Show()
如果这是保存数据,那么您需要找到某种存储数据的方法(可能在表单中的静态变量中)。这是实现您想要实现的目标的正确方法。
如果我的 VB 关闭了,你也必须原谅我,已经有一段时间了。
其他提示
捕获 FormClosing 事件,如果原因是 UserClosing,则将该事件的 Cancel 设置为 true。
像下面这样:
Private Sub Form1_FormClosing(sender as Object, e as FormClosingEventArgs) _
Handles Form1.FormClosing
if e.CloseReason = CloseReason.UserClosing then
e.Cancel = true
Me.Hide()
end if
End Sub
formclose 事件允许我对表单进行托管退出,因此我添加了一个确认退出的问题。我还有一个表单标志 bterminate 来强制取消我想要的位置,因此不问这个问题。谢谢你的建议也对我有帮助:)
Dim msgboxresponse As MsgBoxResult
If e.CloseReason = CloseReason.UserClosing Then
If Not Me.bTerminate Then
msgboxresponse = MsgBox("Are you sure you want to cancel adding?", _
MsgBoxStyle.Question + MsgBoxStyle.YesNo, Me.Text)
If msgboxresponse <> MsgBoxResult.Yes Then
e.Cancel = True
Return
End If
End If
End If
@约翰 将表单隐藏在他的代码中,上面的答案提供了该情况的解决方案。但通常情况下,您并不打算再次使用该表格,因此您确实 做 希望该表格被处置。如果您使用处理 FormClosing 事件,则所有与 Close 相关的活动都将集中在一处 Me.FormClosing
将其添加到您已有的任何取消/关闭/退出代码中。例如在@John的例子中:
Private Sub Cancel_Button_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Cancel_Button.Click, Me.FormClosing
....More code
Me.Dispose
End Sub
注意使用 Me.Dispose
而不是任何现有的 Me.Close
. 。如果您离开 Me.Close
你将创建一个无限循环。看 这是为了 Close 和 Dispose 之间的细微差别.
同意处理 FormClosing 事件。或者更改窗体上的属性以隐藏系统 X 控件。
我已经尝试了所有内容,如果您只想关闭,而无需显示消息框,它就不起作用,您只需要:
Private Sub FORM1_FormClosing(sender As Object, e As FormClosingEventArgs) 处理 Me.FormClosing
>e.Cancel = False
>FORM2.Show() (if you want to show another form)
结束子
希望这对您有帮助...!