【问题标题】:Data Validation in WinForms with the ErrorProvider component使用 ErrorProvider 组件在 WinForms 中进行数据验证
【发布时间】:2014-12-25 07:10:28
【问题描述】:

我是 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, "");
        }
    }

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

我的问题是为什么我的 TextBox 只在我点击它时才有效,如何让我的“保存”按钮检查 TextBox 与 ErrorProvider 组件的验证?

【问题讨论】:

  • 您需要在按钮单击时进行验证,而不是在输入文本框时引发的验证事件。所以删除所有事件只需点击按钮即可。然后将上面的代码移动到按钮单击事件处理程序,它应该没问题
  • ErrorProvider 做任何验证,它只是报告错误。什么都不是你can't fix

标签: c# winforms validation errorprovider


【解决方案1】:

我认为验证的整个概念都是废话。为什么我要验证 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();
}

【讨论】:

    猜你喜欢
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2017-11-27
    相关资源
    最近更新 更多