【WinForm.NET开发】如何验证用户输入

发布时间:2024年01月03日

本文内容

  1. MaskedTextBox 控件
  2. 事件驱动的验证
  3. 隐式和显式验证
  4. 关闭窗体和重写验证

用户在应用程序中输入数据后,建议在应用程序使用数据之前验证数据是否有效。 可以要求某些文本字段的长度不能为零,字段应设置为电话号码格式,或者字符串中不得包含无效字符。 Windows 窗体提供了多种方式来验证应用程序中的输入。

1、MaskedTextBox 控件

如果需要用户以明确定义的格式输入数据,例如电话号码或零件编号,则可以使用?MaskedTextBox?控件以最少的代码快速实现此目的。 掩码是由掩码语言中的字符组成的字符串,用于指定可在文本框中的任何特定位置输入的字符。 控件向用户显示一组提示。 如果用户键入错误条目(例如,用户在需要输入数字时键入字母),则控件将自动拒绝输入。

MaskedTextBox?使用的掩码语言是灵活的。 它允许指定必填字符、可选字符、文本字符(例如连字符和括号)、货币字符和日期分隔符。 控件绑定到数据源时也可以正常工作。 可使用数据绑定上的?Format?事件重格式化输入数据,使其符合掩码;可使用?Parse?事件重格式化输出数据,使其符合数据字段的规范。

2、事件驱动的验证

如果要获得对验证的完全编程控制,或者需要复杂的验证检查,则应使用大多数 Windows 窗体控件中内置的验证事件。 每个接受自由格式用户输入的控件都有?Validating?事件,并且控件需要数据验证时会发生该事件。 在?Validating?事件处理方法中,可以通过多种方式验证用户输入。 例如,如果文本框必须包含邮政编码,则可以通过以下方式进行验证:

  • 如果邮政编码必须属于特定的邮政编码组,则可以对输入进行字符串比较,以验证用户输入的数据。 例如,如果邮政编码必须属于集合?{10001, 10002, 10003},则可以进行字符串比较来验证数据。

  • 如果邮政编码必须采用特定格式,则可以使用正则表达式来验证用户输入的数据。 例如,若要验证格式?#####?或?#####-####,可以使用正则表达式?^(\d{5})(-\d{4})?$。 若要验证格式?A#A #A#,可以使用正则表达式?[A-Z]\d[A-Z] \d[A-Z]\d。?

  • 如果邮政编码必须是有效的美国邮政编码,则可以调用邮政编码 Web 服务来验证用户输入的数据。

Validating?事件由类型为?CancelEventArgs?的对象提供。 如果确定控件的数据无效,可将此对象的?Cancel?属性设置为?true,以取消?Validating?事件。 如果未设置?Cancel?属性,则 Windows 窗体将假定针对该控件的验证成功,并引发?Validated?事件。

有关对?TextBox?中的电子邮件地址进行验证的代码示例,请参阅?Validating?事件参考。

事件驱动的验证数据绑定控件

将控件绑定到数据源(例如数据库表)时,验证很有用。 通过使用验证,可确保控件的数据符合数据源所需的格式,并可确保其不包含任何不安全的特殊字符,例如引号和反斜杠。

使用数据绑定时,控件中的数据会在?Validating?事件执行期间与数据源同步。 如果取消?Validating?事件,则数据不会与数据源同步。

?重要

如果在?Validating?事件之后进行自定义验证,不会影响数据绑定。 例如,如果使用?Validated?事件中的代码尝试取消数据绑定,仍将发生数据绑定。 在这种情况下,若要在?Validated?事件中执行验证,请将控件的?Binding.DataSourceUpdateMode?属性从?DataSourceUpdateMode.OnValidation?更改为?DataSourceUpdateMode.Never,然后将?your-control.DataBindings["field-name"].WriteValue()?添加到验证代码。

3、隐式和显式验证

何时验证控件的数据? 具体取决于开发人员。 可以根据应用程序的需要使用隐式或显式验证。

3.1 隐式验证

隐式验证方法在用户输入数据时对其进行验证。 通过在按键被按下时读取按键来验证数据,更常见的是,在用户将输入焦点从控件移开时验证数据。 如果希望在用户工作时为其提供有关数据的即时反馈,则此方法很有用。

如果要对控件使用隐式验证,则必须将该控件的?AutoValidate?属性设置为?EnablePreventFocusChange?或?EnableAllowFocusChange。 如果取消?Validating?事件,则控件的行为将由分配给?AutoValidate?的值决定。 如果分配了?EnablePreventFocusChange,则取消事件不会导致发生?Validated?事件。 输入焦点将保留在当前控件上,直到用户将数据更改为有效格式。 如果分配了?EnableAllowFocusChange,则取消事件时不会发生?Validated?事件,但焦点仍将更改为下一个控件。

将?Disable?分配给?AutoValidate?属性可完全防止隐式验证。 若要验证控件,必须使用显式验证。

3.2 显式验证

显式验证方法可同时验证数据。 可以验证数据,以响应用户操作,例如单击“保存”按钮或“下一步”链接。 发生用户操作时,可以通过以下方式之一触发显式验证:

  • 调用?Validate?以验证最后一个控件是否失去焦点。
  • 调用?ValidateChildren?以验证窗体或容器控件中的所有子级控件。
  • 调用自定义方法,以手动验证控件中的数据。

3.3 控件的默认隐式验证行为

不同的 Windows 窗体控件的?AutoValidate?属性具有不同的默认值。 下表显示了最常见的控件及其默认值。

展开表

控制默认验证行为
ContainerControlInherit
FormEnableAllowFocusChange
PropertyGridVisual Studio 中未公开的属性
ToolStripContainerVisual Studio 中未公开的属性
SplitContainerInherit
UserControlEnableAllowFocusChange

4、关闭窗体和重写验证

控件保持焦点时,由于其所包含的数据无效,因此无法通过以下常用方法之一关闭父级窗体:

  • 单击“关闭”按钮。
  • 选择“系统”>“关闭”菜单。
  • 以编程方式调用?Close?方法。

但在某些情况下,无论控件中的值是否有效,均建议让用户关闭窗体。 可以通过为窗体的?FormClosing?事件创建处理程序来重写验证并关闭仍包含无效数据的窗体。 在事件中,将?Cancel?属性设置为?false。?

?备注

如果以这种方式强制关闭窗体,则会丢失窗体控件中尚未保存的所有数据。 此外,模式窗体在关闭时不会验证控件的内容。 你仍可以使用控件验证将焦点锁定在控件上,但不必担心与关闭窗体相关的行为。

文章来源:https://blog.csdn.net/m0_51887793/article/details/135313020
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。