17

我正在冒险通过使某些表单无模式来使我的 VB.NET 应用程序更好地使用。

我想我已经弄清楚如何使用 dlg.Show() 和 dlg.Hide() 而不是调用 dlg.ShowDialog()。我的主应用程序表单中有一个无模式对话框的实例:

Public theModelessDialog As New dlgModeless

要启动我调用的无模式对话框

theModelessDialog.Show()

dlgModeless我的 OK 和 Cancel 按钮处理程序中

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”按钮吸引了我。当我使用该按钮关闭表单,然后尝试重新打开表单时,我得到

ObjectDisposedException 未处理。无法访问已处置的对象。

我觉得我大部分时间都在那里,但我无法弄清楚如何执行以下任一操作:

  • 隐藏那个“X”按钮
  • 抓住事件,这样我就不会处理对象(就像我点击取消一样对待它)

有任何想法吗?

这个对话框的类是System.Windows.Forms.Form

4

6 回答 6

22

捕获 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
于 2010-05-15T05:09:43.660 回答
4

用于Me.Close()隐藏表单。要打开它,请使用以下代码段:

If theModelessDialog.IsDisposed Then
    theModelessDialog = New dlgModeless
End If
dlgModeless.Show()

如果这是保存数据,那么您需要想办法存储它(可能在表单中的静态变量中)。这是做你想要实现的目标的正确方法。

如果我的 VB 关闭了,你也必须原谅我,已经有一段时间了。

于 2010-05-15T05:08:28.450 回答
1

formclosure 事件允许我对表单进行管理退出,因此我包含了一个确认退出的问题。我还有一个表单标志 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
于 2012-04-06T08:53:16.667 回答
1

@John在他的代码中隐藏了表单,上面的答案为这种情况提供了解决方案。但是,您通常不打算再次使用该表单,因此您确实希望该表单被 Disposed。Me.FormClosing如果您通过将 FormClosing 事件添加到您已有的任何取消/关闭/退出代码来处理 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 之间的细微差别

于 2017-02-13T16:06:36.270 回答
0

同意处理 FormClosing 事件。或者更改窗体上的属性以隐藏系统 X 控件。

于 2010-05-15T05:28:27.903 回答
0

我已经尝试了所有方法,如果您只想关闭而不显示消息框,它就不起作用,您只需要:

Private Sub FORM1_FormClosing(sender As Object, e As FormClosingEventArgs) 处理 Me.FormClosing

 >e.Cancel = False
 >FORM2.Show()   (if you want to show another form)

结束子

希望这可以帮助你......!

于 2016-12-09T15:36:42.333 回答