2

当我尝试使用 Windows 关闭按钮 (X) 关闭表单时,有什么方法可以关闭该死的错误提供程序。它会触发验证,用户必须填写所有字段才能关闭表单。这将是一个可用性问题,因为许多人倾向于使用 (X) 按钮关闭表单。

我已经放置了一个取消按钮,导致验证为假,它也触发了验证。

我发现有人说如果你使用 Form.Close() 函数验证运行......我怎么能克服这个烦人的功能。

我有一个 MDI 结构并使用

 CreateExam.MdiParent = Me
        CreateExam.Show()

在 mdi 父菜单项上单击

并将其作为设置验证

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
        If String.IsNullOrEmpty(TextBox1.Text) Then
            Err.SetError(TextBox1, "required")
            e.Cancel = True
        End If
        If TextBox1.Text.Contains("'") Then
            Err.SetError(TextBox1, "Invalid Char")
            e.Cancel = True
        End If
    End Sub

任何帮助深表感谢。谷歌搜索只显示用户在使用命令按钮作为关闭按钮时遇到问题的结果,这也导致了我的问题

4

2 回答 2

4

ValidateChildren() 方法防止表单关闭。将此代码粘贴到您的表单中以解决该问题:

protected override void OnFormClosing(FormClosingEventArgs e) {
  e.Cancel = false;
}
于 2010-03-20T12:10:55.093 回答
2

这是非常简单的修复,在您的表单Closing事件中,设置一个标志以指示离开表单,例如blnLeave,当表单被加载时,将标志设置为False,当Closing事件被触发时,将其设置True为该事件处理程序中,然后更改如下

Private Sub TextBox1_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) 处理 TextBox1.Validating

        如果 (blnLeave) 那么
            e.取消=假;
            返回
        万一

        如果 String.IsNullOrEmpty(TextBox1.Text) 那么
            Err.SetError(TextBox1,“必需”)
            e.取消=真
        万一
        如果 TextBox1.Text.Contains("'") 那么
            Err.SetError(TextBox1, "Invalid Char")
            e.取消=真
        万一
    结束子

编辑:根据 OP 的评论修改了这个答案以包含在内。我的建议是处理表单的关闭事件,如图所示

    Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) 处理 MyBase.FormClosed
        blnLeave = 真
    结束子

并在窗体的窗口过程覆盖中处理它,如下所示......

    Private Const SC_CLOSE As Integer = &HF060
    Private Const WM_MENUSELECT As Integer = &H11F
    私有函数 LoWord(ByVal Num As Integer) As Integer
        LoWord = Num & &HFFFF
    结束功能
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        如果 m.Msg = WM_MENUSELECT 那么
            如果 LoWord(m.WParam.ToInt32()) = SC_CLOSE 那么
                ' 通过系统菜单处理关闭
                blnLeave = 真
            万一
        万一
        MyBase.WndProc(m)
    结束子
于 2010-03-20T03:06:34.350 回答