c# - 验证用户输入/给予 .NET 控件状态 OK 或 NOK

标签 c# .net winforms

我正在考虑验证用户输入的最佳方式。

让我们想象一些 TextBoxes、CheckBoxes 或您喜欢的任何 .NET 控件,其中用户输入必须被验证为 OK 或 NOK。一旦用户填写了所有必填字段,他就会通过按钮提交。

现在我必须知道哪些字段之前被确认为 OK,哪些字段被确认为 NOK。到目前为止,我总是通过为每个控件声明一个全局 bool 变量来处理这种情况。但是我不喜欢那样...

我很确定一定有另一种方法!我想做的是使用名为 status 或类似属性的 OK 或 NOK 属性扩展这些 .NET 控件。你能做到吗?如果是这样,你是怎么做到的?类似的东西已经存在了吗?

感谢您的回复!

最佳答案

您在 Windows 窗体中有一些有用的工具来执行验证和显示错误消息,包括:

使用以上选项:

  • 您可以在对模型类使用数据绑定(bind)时执行验证。
  • 您可以在不使用数据绑定(bind)时执行验证。
  • 您可以在处于无效状态的控件附近显示错误消息和错误图标。
  • 您可以决定防止焦点因无效控件而改变或让焦点改变。
  • 您可以显示表单的验证摘要。
  • 您也可以申请DataAnnotations Validations in Windows Forms

IDataErrorInfo 接口(interface)

在您有一些模型类的情况下,最适合在 Windows 窗体中进行验证和提供错误消息的方法是实现 IDataErrorInfo。它受数据绑定(bind)机制和一些 Windows 窗体控件(如 DataGridViewErrorProvider)的支持。

为了简单起见,您可以在类中编写验证规则并使用 IDataErrorInfo 属性返回错误消息。即使您想应用更高级的场景,例如使用验证引擎,最后最好实现 IDataErrorInfo 以获得与寡妇窗体的最大一致性。

您将使用 ErrorProvider 来显示错误消息。将它绑定(bind)到您的数据源就足够了,它会自动显示错误。

控件的验证事件

如果您没有模型类并且所有验证都应该针对控件进行,最好的选择是使用控件的 Validating 事件。您可以在那里设置 e.Cancel = true 以将控件状态设置为无效。然后您可以防止焦点更改或使用控制状态来获取验证摘要。

在这种情况下,您将使用 ErrorProvider 来显示错误。以这种方式在 Validating 事件中为控件设置错误就足够了:errorProvider1.SetError(control1, "Some Error") 或者您可以设置一个空的错误消息以删除验证错误。

ErrorProvider 组件
在这两种情况下,当您使用数据绑定(bind)或使用 Validating 事件时,如上所述,ErrorProvider 会显示错误图标,并在控件附近显示错误消息的工具提示。 (DataGridView 使用它自己的机制来显示行和单元格的错误,而不使用 ErrorProvider。)

您还可以使用该组件通过返回每个控件的错误消息的组件的 GetError 方法获取表单的验证摘要。

ValidateChildren 方法和表单的 AutoValidate 属性

您可以使用表单或您的容器控件的ValidateChildren 方法来检查您的控件是否存在验证错误。

根据表单的 AutoValidate 属性的值,它可以防止焦点更改或让焦点从无效控件更改。

关于c# - 验证用户输入/给予 .NET 控件状态 OK 或 NOK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35988786/

相关文章:

c# - 无法从 Visual Studio 2013 连接到远程 SQL 服务器上的数据库

c# - 如果 XSD 未指定 maxOccurs,则 XML 文档中的最大元素数是多少?

c# - 为什么 Process.WaitForExit 会阻塞,即使我将它放在单独的线程中?

c# - 如何在鼠标单击时选择 TextBox 的所有文本? (TextBox.SelectAll() 不适用于 TextBox.Enter)

c# - 更改 CheckedListBox.SelectedItem 文本

c# - 理解 Func<T, TResult> 使用 MVC 委托(delegate)

c# - 从 MethodInfo 获取具有私有(private)(不可访问)类型的 Func<>

c# - Math.Round 圆我

.net - 如何在 CLR 1.1 或 2.0 应用程序中使用 CLR 4.0 组件?

.net - 浏览器内存问题