【问题标题】:Preventing a VB.Net form from closing防止 VB.Net 表单关闭
【发布时间】:2012-07-16 07:09:15
【问题描述】:

我们正在使用这种编码来处理点击大红色 X 作为绕过表单上所有文本框验证的手段。

代码将测试是否对表单上的数据绑定控件进行了任何更改。代码处理取消在关闭表单之前所做的更改。

还想取消单击大 X 并且不允许关闭表单。

您能否展示任何不允许表单实际关闭的所需编码?我们想在下面的编码显示中的 Else 语句之后添加这个新的编码。

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

    Select Case ((m.WParam.ToInt64() And &HFFFF) And &HFFF0)

        Case &HF060 ' The user chose to close the form.

            Me.StudentsBindingSource.EndEdit()
            Me.AutoValidate = System.Windows.Forms.AutoValidate.Disable

            If Me.StudentsDataSet.HasChanges Then

                ' Alert the user.
                '----------------
                If MessageBox.Show("You are about to loose any *** Student *** changes you have made! " & vbCrLf & vbCrLf & _
                                   "ARE YOU SURE YOU WANT TO DO THIS?" & vbCrLf & vbCrLf, _
                                   "*** W A R N I N G ***", _
                                   MessageBoxButtons.YesNo, _
                                   MessageBoxIcon.Warning, _
                                   MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then

                    RibbonButtonCancelChanges_Click(Nothing, Nothing)
                Else
                    ' Reset validation.
                    '------------------
                    Me.CausesValidation = True
                End If
            End If
    End Select

    MyBase.WndProc(m)
End Sub

我们尝试了这个,但是执行文本框控件的验证事件不是我们想要的。

Private Sub FormStudents_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing

    Me.AutoValidate = System.Windows.Forms.AutoValidate.Disable
    Me.StudentsBindingSource.EndEdit()

    If Me.StudentsDataSet.HasChanges Then

        ' Alert the user.
        '----------------
        If MessageBox.Show("You are about to loose any *** Student *** changes you have made! " & vbCrLf & vbCrLf & _
                           "ARE YOU SURE YOU WANT TO DO THIS?" & vbCrLf & vbCrLf, _
                           "*** W A R N I N G ***", _
                           MessageBoxButtons.YesNo, _
                           MessageBoxIcon.Warning, _
                           MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then

            RibbonButtonCancelChanges_Click(Nothing, Nothing)
        Else
            ' Reset validation.
            '------------------
            Me.CausesValidation = True

            e.Cancel = True
        End If
    End If
End Sub

【问题讨论】:

    标签: vb.net wndproc


    【解决方案1】:

    你根本不应该使用WndProc

    改为处理FormClosing 事件并将e.Cancel 设置为true。

    【讨论】:

    • 刚刚尝试过,e.Cancel 工作正常,但文本框验证执行。有没有办法取消在这种情况下执行的文本框验证?
    • 我将它与 FormClosing 和 WndProc 结合使用。感谢大家的帮助。 :-)
    【解决方案2】:

    正如 SLaks 所说,您应该使用 FormClosing() 事件过程,而不是使用 WndPorc() 引入复杂性。覆盖 WndProc() 用于 C++ 之类的语言,在这些语言中,您没有事件过程来处理这些事件。但是 VB.NET 的简单性为您提供了一个称为 FormClosing() 的事件过程。只需打开您的代码并在对象下拉列表(左侧)中选择您的表单名称,然后从事件下拉列表(右侧)中选择 FormClosing。这应该会给你一个模板来编写你的事件代码,如下所示:

    Private Sub FormClosing(Source as Object, e as EventArgs) Handles MyForm.Closing
        e.Cancel = True
    End Sub
    

    如上图只要加上“e.Cancel = True”,表单永远不会关闭!

    【讨论】:

    • 感谢您的回复。 e.Cancel = True 效果很好,但现在执行文本框控件的验证事件,这就是我们发现使用 WndProc() 覆盖验证事件的原因。
    • 如果你真的想,你仍然可以避免 WndProc()。如果要避免触发文本框的验证事件,可以将文本框控件的 CausesValidation 属性设置为 False。
    【解决方案3】:

    感谢您让我了解 FormClosing 和 e.Cancel

    我能够使用 FormClosing 和 WndProc 的组合来处理我们需要的一切。

    我在表单类名之后添加了这个:

    Dim blneCancel As Boolean = False
    

    我的 WndProc 现在看起来像这样。注意blneCancel的设置。

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    
        Select Case ((m.WParam.ToInt64() And &HFFFF) And &HFFF0)
    
            Case &HF060 ' The user chose to close the form.
    
                Me.StudentsBindingSource.EndEdit()
                Me.AutoValidate = System.Windows.Forms.AutoValidate.Disable
    
                If Me.StudentsDataSet.HasChanges Then
    
                    ' Alert the user.
                    '----------------
                    If MessageBox.Show("You are about to loose any *** Student *** changes you have made! " & vbCrLf & vbCrLf & _
                                       "ARE YOU SURE YOU WANT TO DO THIS?" & vbCrLf & vbCrLf, _
                                       "*** W A R N I N G ***", _
                                       MessageBoxButtons.YesNo, _
                                       MessageBoxIcon.Warning, _
                                       MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
    
                        RibbonButtonCancelChanges_Click(Nothing, Nothing)
                    Else
                        ' Reset validation.
                        '------------------
                        Me.CausesValidation = True
                        blneCancel = True
                    End If
                End If
        End Select
    
        MyBase.WndProc(m)
    End Sub
    

    FormClosing 过程如下所示:

    Private Sub FormStudents_FormClosing(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    
        If blneCancel = True Then
            e.Cancel = True
        End If
    End Sub
    

    现在用户可以在电话号码文本框中输入任何内容,并且不会验证用户是否单击大 X 以关闭表单。该表单将仅显示消息警告用户某些内容已更改,并让他们选择返回并尝试保存更改或直接退出而不保存任何内容。

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多