我是WinForms的新手,并且有一个基本形式,用户将数据输入到TextBox,然后按下" save"或"取消。"我想实现数据验证以确保用户实际在TextBox中输入内容,但截至目前,只有单击TextBox本身时才会显示ErrorProvider图标,并且当" Save&#34时不会检查验证;像我想要的那样按下按钮。我也使用Visual Studio 2013。
此事件处理程序代码位于btnSave_Click
方法中:
this.txtNote.Validating += new
System.ComponentModel.CancelEventHandler(this.txtNote_Validating);
txtNote_Validating
方法如下:
protected void txtNote_Validating(object sender,
System.ComponentModel.CancelEventArgs e)
{
if(txtNote.Text.Length == 0)
{
errorProvider1.SetError((Control)txtNote, "An explanation of your time entry is required.");
}
else
{
errorProvider1.SetError(txtNote, "");
}
}
另外,我没有在txtNote
的属性窗口中添加任何事件,并且已在属性窗口中添加了验证事件:txtNote_Validating
并点击:btnSave_Click
到我的btnSave事件
我的问题是为什么我的TextBox只在我点击它时才会验证,我怎样才能使我的"保存"按钮检查TextBox与ErrorProvider组件的验证?
答案 0 :(得分:5)
我认为验证的整个概念是废话。为什么我要在失去焦点时验证TextBox
值?我想将其验证为用户输入文本,或者最后,当用户按确定按钮检查输入值的交叉依赖性时。
特别是在您的情况下:不会进行验证,因为您可以单击保存按钮而不在TextBox
中输入任何内容。或者当你点击取消按钮时,它会在输入值TextBox
的过程中发生,这是愚蠢的,因为你只想关闭愚蠢的形式;)
有两种验证方法:
第一个基本上一直监视用户输入,并保持按钮保存禁用,直到所有字段都填满且值正常。第二个保持按钮保存一直启用,但是一旦用户按下它,一切都将被验证,如果一些无效 - 什么都不会发生。
这两种方法都可以使用提示让用户显示错误。在您的情况下ErrorProvider
。
让我们应用第二种方法
void buttonSave_Clicked(object sender, EventArgs e)
{
if(string.IsNullOfEmpty(txtNote))
{
errorProvider1.SetError(txtNote, "Omg, can't haz empty note");
return;
}
if(string.IsNullOfEmpty(someOtherTextBox))
{
errorProvider1.SetError(someOtherTextBox, "Omg, no empty plx!");
return;
}
//
...
}
这里我们逐个验证值。顺序中的第一个将导致ErrorProvider
被设置并且函数将退出。也可以为所有无效控件显示ErrorProvider
:
void buttonSave_Clicked(object sender, EventArgs e)
{
bool isOk = true;
if(string.IsNullOfEmpty(txtNote))
{
errorProvider1.SetError(txtNote, "Omg, can't haz empty note");
isOk = false;
}
if(string.IsNullOfEmpty(someOtherTextBox))
{
errorProvider1.SetError(someOtherTextBox, "Omg, no empty plx!");
isOk = false;
}
//
if(isOk)
{
...
}
}
一个问题是,ErrorProvider
一旦设定,将永远眨眼(或直到你修复错误并再次点击按钮)。简单的解决方法是使用Timer
,这会在几秒钟后关闭错误。设置错误 - 启动计时器,时间到期时:
private void timerError_Tick(object sender, EventArgs e)
{
timerError.Stop();
errorProvider1.Clear();
}