【问题标题】:MessageBox Within A WinForms TextBox Validating Event HandlerWinForms 文本框验证事件处理程序中的消息框
【发布时间】:2014-08-01 15:33:52
【问题描述】:

我有一个文本框经过验证以确保它不是空白的情况。但是,在某些极端情况下,该值实际上应该为空。在构造函数中设置了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 对话框从不显示。我知道根据文档,Microsoft 声明如下:

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

显然,当显示 MessageBox 时,控件将隐式失去焦点......所以也许这就是发生这种奇怪行为的原因。谁能证实这一点?有什么更好的方法来处理这种情况的建议吗?

【问题讨论】:

  • 如果空白是有效值(但需要确认),则不要在验证中进行检查。在控制失去焦点时执行此操作(您可能需要在每次确认 Tag 属性更改后保存以前的值,以便在用户取消该更改时恢复它)。

标签: c# .net winforms validation event-handling


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多