3

我是 WinForms 的新手,并且有一个基本表单,用户可以在其中向 TextBox 输入数据,并且可以按“保存”或“取消”。我想实现数据验证以确保用户实际上在 TextBox 中输入了一些内容,但截至目前,ErrorProvider 图标仅在单击 TextBox 本身时出现,并且在按下“保存”按钮时不检查验证,如我是故意的。我也在使用 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, "");
        }
    }

此外,我没有在我的属性窗口中添加任何事件,并且在属性窗口中的我的 btnSave 事件中txtNote添加了一个验证事件:txtNote_Validating和 Click :。btnSave_Click

我的问题是为什么我的 TextBox 仅在我单击它时才进行验证,以及如何使我的“保存”按钮检查 TextBox 与 ErrorProvider 组件的验证?

4

1 回答 1

5

我认为验证的整个概念都是废话。为什么我要验证TextBox失去焦点的价值?我想验证它作为用户输入文本或最后,当用户按下Ok按钮检查输入值的交叉依赖关系。

特别是在您的情况下:验证不会发生,因为您可以单击Save按钮而不输入任何内容TextBox。或者它会在您单击Cancel按钮时发生,而在输入值的过程中TextBox,这很愚蠢,因为您只想关闭愚蠢的表单;)

有两种验证方法:

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

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

两种方法都可以使用提示让用户显示错误。在你的情况下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();
}
于 2014-10-29T15:26:41.580 回答