使用错误提供程序和验证事件的表单验证

本文关键字:验证 事件 表单 程序 错误 | 更新日期: 2023-09-27 18:30:49

我对使用验证相当陌生。 我有一个 C# winform 项目,我想在关闭之前验证表单。 但是,我只希望在单击按钮时进行此验证。 所以我有一个事件为此触发,如下所示:

if (!this.ValidateChildren())
{
   MessageBox.Show("Validation failed");
}
else
{
   MessageBox.Show("Validation passed with flying colours. :)");
   this.Close();
}

我只想在验证成功时关闭表单。 足够简单。 但是,我不希望在文本框失去焦点时运行验证,只在验证整个表单时运行。

我要验证的每个控件,我都已注册了"验证"事件。 他们使用"e.Cancel = true;"来取消验证。 我一直在使用 ErrorProvider 类来直观地支持这一点。

所以基本的问题是,只有在我想要的时候而不是在焦点从控件上丢失时,验证一组特定控件的最佳方法是什么?

编辑:目前作为一种解决方法,我有一个打开和关闭"原因验证"属性的方法。 我默认所有内容都不为 CauseValidation,在使用事件验证整个表单之前启用它们,并在再次禁用它们之后禁用它们。

我真的不认为这是一个理想的方法。 还有比这更"优雅"的解决方案吗?

使用错误提供程序和验证事件的表单验证

我认为这是使用错误提供程序组件进行验证的最佳方式

(或者)试试这个

http://www.c-sharpcorner.com/uploadfile/john_charles/validating-data-entry-in-windows-forms-application/

我认为您正在寻找的是您在设置时获得的行为

form.Autovalidate = Disable

form.Autovalidate = EnableAllowFocusChange

我使用了以下内容:

1) 定义要在某种集合中验证的控件。

2) 编写一个验证例程,可能直接在按钮单击下,循环遍历控件集合,检查控件内容的值/有效性。如果验证很复杂,也许可以遵从每个控件的私有方法。

3) 如果控件的内容无效,请将其与验证消息一起传递给 ErrorProvider 的 SetError 方法。

4) 根据有效状态,让表单关闭(对话结果 = 确定)或保持表单打开(对话结果 = 无)。

如果执行此操作,则可以使用 ErrorProvider 将验证重构为基本窗体,并从中继承。

    private void TxtNama_Validating(object sender, CancelEventArgs e)
    {
        e.Cancel = string.IsNullOrEmpty(TxtNama.Text);
        this.errorProvider1.SetError(TxtNama, "Nama Barang Harus Diisi..!!");            
    }
    private void CmdSave_Click(object sender, EventArgs e)
    {
        if(this.ValidateChildren(ValidationConstraints.Enabled))
        {
            MessageBox.Show("Simpan Data Barang..?" , "SIMPAN DATA", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
        }
    }

上面的例子效果很好,但是将 errorProvider 对象与按钮相结合很有趣。 花了一点时间才得到这个对象。验证子() 方法,在验证失败时返回 false。

关键似乎是将 CancelEventargs.Cancel 属性设置为 true;回想起来很明显,但也许这会节省其他人的时间。

    Form1.Autovalide = Disabled
    private void textBox2_Validating(object sender, CancelEventArgs e)
    {
       if (textBox2.Text.Length == 0)
       {
          errorProvider1.SetError(textBox2, "Must provide an entry.");
          e.Cancel = true;
       } else {
          errorProvider1.SetError(textbox2, "");
       }
    }
    private void button1_click(object sender, EventArgs e)
    {
       if (this.ValidateChildren(ValidationConstraints.Enabled | ValidationConstraints.ImmediateChildren))
       {
          MessageBox.Show("All's well.", "Valid", MessageBoxButtons.OK);
       }  else {
          MessageBox.Show("All is ruin and woe!", "Invalid", MessageBoxButtons.OK);
       }
}

所以我知道我有点晚了。但这个问题也咬了我一口

我最终做的是使用取消按钮MouseEnter和MouseLeave事件

private void btnCancel_MouseEnter(object sender, EventArgs e)
        {
            AutoValidate = AutoValidate.Disable;
        }
private void btnCancel_MouseLeave(object sender, EventArgs e)
        {
            AutoValidate = AutoValidate.EnablePreventFocusChange;
        }

这将在我输入按钮单击时禁用验证,然后在单击时可以触发取消按钮单击事件,我可以在其中执行所需的任何逻辑,包括清除错误。