消息框在一个WinForms文本框验证事件处理程序

本文关键字:文本 WinForms 验证 事件处理 程序 一个 消息 | 更新日期: 2023-09-27 18:16:03

我有一个验证文本框以确保它不是空白的情况。但是,在某些极端情况下,该值实际上应该为空。在构造函数中设置一个Nullable<bool> blankText = null变量。我使用这段代码来验证和再次检查值是否可以为空,通过与用户确认:

private void text_Validating(object sender, CancelEventArgs e)
{
        if (string.IsNullOrWhiteSpace(text.Text))
        {
            do
            {
                if (blankText.HasValue && !blankText.Value)
                {
                    errorProvider.SetError(text, "Blank or whitespace!");
                    e.Cancel = true;
                    break;
                }
                else if (blankText.HasValue && BlankText.Value)
                {
                    errorProvider.SetError(text, "");
                    e.Cancel = false;
                    break;
                }
                else
                {
                    DialogResult result = MessageBox.Show(this, "Field is blank, or contains only whitespace.'nAre you sure you want to use a blank/whitespace?", String.Empty, MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (result == DialogResult.Yes)
                        blankText = true;
                    else
                        blankText = false;
                }
            }
            while (true);
        }
        else
        {
            e.Cancel = false;
            errorProvider.SetError(text, "");
        }
    }

即使blankText = null的值,它仍然会设置errorProvider错误并失败验证。永远不会显示MessageBox对话框。我知道,根据文档微软声明如下:

不要尝试在Enter、GotFocus、Leave、LostFocus、validation或Validated事件处理程序中设置焦点。这样做可能会导致应用程序或操作系统停止响应。源

显然,当MessageBox显示时,控件将隐式地失去焦点…所以也许这就是为什么会出现这种奇怪的行为。有人能证实吗?有什么更好的办法来处理这个案子吗?

消息框在一个WinForms文本框验证事件处理程序

为了响应@adriano-repetti评论和一些额外的测试,我从验证事件中删除了提示符。我使用的完整解决方案是创建bool?的附加属性,可以检查是否允许,不允许或未定义的空白值。如果不允许或未定义,则如果值为空,则验证失败。如果由于空白值和新的IsBlankValueAllowed属性导致验证失败,则会显示提示,要求用户确认此行为。我决定使用属性而不是标签属性中的数据,因为它感觉不那么"被黑客"。