我有一个包含多个文本框和其他控件的表单。我正在使用errorprovider控件,我在每个需要验证的文本框上连接了验证事件。当控件将焦点转移到另一个控件时,会发生Validating事件。因此,当您使用Tab键离开当前控件或使用鼠标1单击另一个控件时,会发生该事件。我发现这非常烦人,只是举个例子,如果我打开这个winform,然后立即尝试关闭它,它不会让我,因为验证会触发抱怨第一个文本框没有输入文本。
我想要的行为是使用errorprovider,如何在单击表单的“保存”按钮时验证整个表单?
谢谢
答案 0 :(得分:10)
检查属性Form.AutoValidate。
可能的值:
不会发生隐式验证。设置此值不会 干扰显式调用 验证或验证孩子。
当隐藏验证发生时 控制失去了焦点。
发生隐式验证,但是如果 验证失败,焦点仍然存在 更改为新控件。如果 验证失败,Validated事件 不会开枪。
将其设置为EnableAllowFocusChange
将解决打开表单的问题,并立即尝试关闭它,因为焦点将转移到“取消”按钮。
如果您想完全控制验证,可以将其设置为Disable
并使用Form.Validate
和Form.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将设置模型并检查错误)。
也许更好的方法是不使用对话框来显示错误(我假设你是因为你说这是关闭表单的问题)。工具提示可以提供更好的用户体验。如果用户忽略工具提示,则可以在单击“保存”时提供对话框。即使数据不正确,他们也可以关闭表单。