我有一个验证文本框以确保它不是空白的情况。但是,在某些极端情况下,该值实际上应该为空。在构造函数中设置一个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显示时,控件将隐式地失去焦点…所以也许这就是为什么会出现这种奇怪的行为。有人能证实吗?有什么更好的办法来处理这个案子吗?
为了响应@adriano-repetti评论和一些额外的测试,我从验证事件中删除了提示符。我使用的完整解决方案是创建bool?
的附加属性,可以检查是否允许,不允许或未定义的空白值。如果不允许或未定义,则如果值为空,则验证失败。如果由于空白值和新的IsBlankValueAllowed属性导致验证失败,则会显示提示,要求用户确认此行为。我决定使用属性而不是标签属性中的数据,因为它感觉不那么"被黑客"。