同时验证C#窗体上的多个文本框

时间:2009-12-24 16:57:11

标签: c# winforms validation

我有一个包含多个文本框和其他控件的表单。我正在使用errorprovider控件,我在每个需要验证的文本框上连接了验证事件。当控件将焦点转移到另一个控件时,会发生Validating事件。因此,当您使用Tab键离开当前控件或使用鼠标1单击另一个控件时,会发生该事件。我发现这非常烦人,只是举个例子,如果我打开这个winform,然后立即尝试关闭它,它不会让我,因为验证会触发抱怨第一个文本框没有输入文本。

我想要的行为是使用errorprovider,如何在单击表单的“保存”按钮时验证整个表单?

谢谢

4 个答案:

答案 0 :(得分:10)

检查属性Form.AutoValidate

可能的值:

  • 禁用
  

不会发生隐式验证。设置此值不会   干扰显式调用   验证或验证孩子。

  • EnablePreventFocusChange
  

当隐藏验证发生时   控制失去了焦点。

  • EnableAllowFocusChange
  

发生隐式验证,但是如果   验证失败,焦点仍然存在   更改为新控件。如果   验证失败,Validated事件   不会开枪。

将其设置为EnableAllowFocusChange将解决打开表单的问题,并立即尝试关闭它,因为焦点将转移到“取消”按钮。

如果您想完全控制验证,可以将其设置为Disable并使用Form.ValidateForm.ValidateChildren执行手动验证。我不是100%肯定,但我相信Form.ValidateChildren不会触发放置在TabControl内的控件的验证事件。

答案 1 :(得分:1)

将所有控件(Save按钮除外)的CausesValidation属性设置为False。这将禁止除按钮之外的所有控件的Validating事件。它可能不是你想要的确切行为,因为当你改变对按钮的关注时会发生烦人的行为,但它接近你想要的想法。

另一个选项,如果不起作用,是在单击按钮时循环控制并一次手动验证它们......

以下是MSDN链接:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.causesvalidation.aspx

答案 2 :(得分:1)

为了保持更新,JoãoAngelo说Form.ValidateChildren()不会触发内部控件的验证,例如GroupBox或TabControl。

但是,您可以将ValidationContraints传递给重载的ValidateChildren(ValidationConstraints)方法,并将其设置为None:

“验证所有子控件以及这些子控件的所有子控件,无论其属性设置如何。”

答案 3 :(得分:0)

没有任何方法可以让WinForms在保存时验证控件。与Web表单不同,没有任何“提交”或“保存”事件(至少不在表单上)。您可以将表单编程为以这种方式运行,但您将无法使用数据绑定(Save将设置模型并检查错误)。

也许更好的方法是不使用对话框来显示错误(我假设你是因为你说这是关闭表单的问题)。工具提示可以提供更好的用户体验。如果用户忽略工具提示,则可以在单击“保存”时提供对话框。即使数据不正确,他们也可以关闭表单。