使用错误提供程序和验证事件的表单验证
本文关键字:验证 事件 表单 程序 错误 | 更新日期: 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;
}
这将在我输入按钮单击时禁用验证,然后在单击时可以触发取消按钮单击事件,我可以在其中执行所需的任何逻辑,包括清除错误。