0

我们正在使用此编码来处理单击大红色 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
4

3 回答 3

11

你根本不应该使用WndProc

相反,处理FormClosing事件并设置e.Cancel为 true。

于 2012-07-15T20:20:05.140 回答
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”,表单将永远不会关闭!

于 2012-07-15T20:34:39.003 回答
0

感谢您让我了解 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 以关闭表单。该表单将仅显示消息警告用户某些内容已更改,并让他们选择返回并尝试保存更改或直接退出而不保存任何内容。

于 2012-07-15T23:09:15.463 回答