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

C# WinForms TextBox中的MessageBox验证事件处理程序,c#,.net,winforms,validation,event-handling,C#,.net,Winforms,Validation,Event Handling,我有一个案例,验证文本框以确保它不是空的。但是,在某些边缘情况下,值实际上应该为空。构造函数中设置了一个Nullable blankText=null变量。我使用此代码验证并再次检查值是否可以为空,方法是与用户确认: private void text_Validating(object sender, CancelEventArgs e) { if (string.IsNullOrWhiteSpace(text.Text)) { do

我有一个案例,验证文本框以确保它不是空的。但是,在某些边缘情况下,值实际上应该为空。构造函数中设置了一个
Nullable 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、GOTCHOCUS、LEVE、LostFocus、Validating或Validated事件处理程序中设置焦点。这样做可能会导致应用程序或操作系统停止响应


显然,当MessageBox显示时,控件将隐式地失去焦点…所以这可能就是为什么会发生这种奇怪的行为。有人能证实这一点吗?关于如何更好地处理这种情况,有什么建议吗?

针对@adriano repetti评论和一些附加测试,我从验证事件中删除了提示。我使用的完整解决方案是创建一个附加属性
bool?
,如果允许、不允许或未定义空值,则可以检查该属性。如果不允许或未定义,则如果值为空,验证将失败。如果验证因空白值和新的IsBlankValueAllowed属性而失败,则会显示提示,要求用户确认此行为。我决定使用一个属性而不是标记属性中的数据,因为它感觉不到太多的“黑客攻击”。

如果blank是一个有效值(但需要确认),那么不要在验证内部进行检查。当控件失去焦点时执行此操作(在每次确认标记属性的更改后,您可能需要保存以前的值,以便在用户取消更改时可以恢复该值)。