【发布时间】: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