我有一个案例,其中验证文本框以确保它不是空白。但是,有些边缘情况下值实际上应为空白。在构造函数中设置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时,控件将隐式失去焦点......所以也许这就是为什么会发生这种奇怪的行为。谁能证实这一点?有关处理此案的更好方法的任何建议吗?
答案 0 :(得分:0)
为了回应@ adriano-repetti评论和一些额外测试,我从验证事件中删除了提示。我使用的完整解决方案是创建bool?
的附加属性,可以检查是否允许,禁止或未定义空值。如果禁用或未定义,则验证将失败,如果值为空。如果由于空值和新的IsBlankValueAllowed属性而导致验证失败,则会显示一个提示,要求用户确认此行为。我决定在Tag属性中使用Property而不是数据,因为它感觉不那么“被黑了”。