使用ErrorProvider组件在WinForms中进行数据验证

时间:2014-10-29 14:20:22

标签: c# winforms validation errorprovider

我是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组件的验证?

1 个答案:

答案 0 :(得分:5)

我认为验证的整个概念是废话。为什么我要在失去焦点时验证TextBox值?我想将其验证为用户输入文本,或者最后,当用户按确定按钮检查输入值的交叉依赖性时。

特别是在您的情况下:不会进行验证,因为您可以单击保存按钮而不在TextBox中输入任何内容。或者当你点击取消按钮时,它会在输入值TextBox的过程中发生,这是愚蠢的,因为你只想关闭愚蠢的形式;)

有两种验证方法:

  • 即时,在编辑期间,阻止用户访问无效命令;
  • final,轻轻拒绝用户命令。

第一个基本上一直监视用户输入,并保持按钮保存禁用,直到所有字段都填满且值正常。第二个保持按钮保存一直启用,但是一旦用户按下它,一切都将被验证,如果一些无效 - 什么都不会发生。

这两种方法都可以使用提示让用户显示错误。在您的情况下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();
}