我正在尝试通过将某些表单设为无模式来使我的 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)

结束子

希望这对您有帮助...!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top