WinForms TextBox验证事件处理程序中的MessageBox

时间:2014-08-01 15:33:53

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

我有一个案例,其中验证文本框以确保它不是空白。但是,有些边缘情况下值实际上应为空白。在构造函数中设置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时,控件将隐式失去焦点......所以也许这就是为什么会发生这种奇怪的行为。谁能证实这一点?有关处理此案的更好方法的任何建议吗?

1 个答案:

答案 0 :(得分:0)

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