我们正在使用此编码来处理大红色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
我们尝试了这个,但文本框控件的Validating事件执行的不是我们想要的。
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
答案 0 :(得分:11)
您根本不应该使用WndProc
。
相反,处理FormClosing
事件并将e.Cancel
设置为true。
答案 1 :(得分: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”,表单永远不会关闭!
答案 2 :(得分: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以关闭表单,则不会验证。表单将显示消息,警告用户某些内容已更改,并让他们选择返回并尝试保存更改,或者只是退出而不保存任何内容。