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

本文内容

  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。 

 备注

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/591825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读——EfficientViT(cvpr2023)

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 1、 从三个角度探讨如何提高vision transformers的效率:内存访问、计算冗余和参数使用。 2.1. Memory Efficiency 红色字体表示操作所花费的时间主要由内存访问决定,…

C语言 linux文件操作(一)

文章目录 一、linux文件权限1.1文件描述符1.2文件描述符的范围和默认值1.3打开文件和文件描述符1.4标准文件描述符1.5文件描述符的重定向和关闭1.6I/O 操作1.7使用文件描述符进行进程通信1.8资源限制 二、C语言文件读写2.1open 函数2.2 flags参数详解2.3 lseek 函数 一、linux文…

c# 并行处理

以下是一个使用 C# 并行处理来读取大量小文件的例子,这个例子中我们使用 Parallel.ForEach 方法并结合 File.ReadAllLines 来提高读取速度: using System; using System.Collections.Concurrent; using System.IO; using System.Linq;class Program {st…

Javaweb之数据库连接池以及lombok类库的详细解析

3. 数据库连接池 在前面我们所讲解的mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。 下面我们就具体的了解下数据库连接池。 3.1 介绍 没有使用数据库连接池: 客户端执行SQL语句:要先创建一…

JS + CSS 实现高亮关键词(不侵入DOM)

之前在做关键词检索高亮功能的时候,研究了下目前前端实现高亮的几种方式,第一就是替换dom元素实现高亮,第二就是利用浏览器新特性Css.highlights结合js选区与光标与CSS高亮伪类实现,实现功能如下: 一、页面布局 一个…

2023春季李宏毅机器学习笔记 02 :机器学习基本概念

资料 课程主页:https://speech.ee.ntu.edu.tw/~hylee/ml/2023-spring.phpGithub:https://github.com/Fafa-DL/Lhy_Machine_LearningB站课程:https://space.bilibili.com/253734135/channel/collectiondetail?sid2014800 一、機器學習基本原理…

Resource Autowire

Resource注入 Java自带的注解,javax.annotation.resource,Spring支持该注解默认按照byName注入方式,通过反射机制自动注入的策略装配策略: ①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配&#xff0c…

位乘积计数-蓝桥

题目链接&#xff1a;1.位乘积计数 - 蓝桥云课 (lanqiao.cn) 解题思路&#xff1a;10的5次数量级暴力居然过了&#xff0c;看来测试样例很水&#xff0c;直接1遍历到n&#xff0c;再用一个循环判断每位数相乘乘机是否等于m即可。 下面是c代码&#xff1a; #include <iost…

叫板GPT-4的Gemini,我做了一个聊天网页,可图片输入,附教程

先看效果&#xff1a; 简介 Gemini 是谷歌研发的最新一代大语言模型&#xff0c;目前有三个版本&#xff0c;被称为中杯、大杯、超大杯&#xff0c;Gemini Ultra 号称可与GPT-4一较高低&#xff1a; Gemini Nano(预览访问) 为设备端体验而构建的最高效模型,支持离线使用场景。…

什么是数据结构?

1、一种非常经典的数据结构。 栈数据结构&#xff1a;stack 2、什么是数据结构&#xff1f; 数据结构通常是&#xff1a;存储数据的容器。而该容器可能存在不同的结构。 数据结构和 java 语言实际上是没有关系&#xff0c;数据结构是一门独立的学科。 在大学计算机专业中&#…

[Redis实战]分布式锁

四、分布式锁 4.1 基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xf…

Rust赋值语句和数字类型

赋值语句 在Rust中&#xff0c;使用let关键字定义变量。格式是let 变量名:变量类型 变量值;&#xff0c;下边是个例子&#xff1a; let age:i32 18;这就是定义一个有符号32位的数字变量age&#xff0c;而其中的值是18。 而在C语言定义变量的语句格式是类型 变量名 变量值。…

【网络技术】【Kali Linux】Wireshark嗅探(三)用户数据报(UDP)协议

一、实验目的 本次实验使用wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解UDP协议的报文格式。 二、网络环境设置 本次实验使用Kali Linux虚拟机完成&#xff0c;主机操作系统为Windows 11&#xff0c;虚拟化平台选择Oracle VM VirtualBox&#xff0c;组网模式选择…

我与VR的再拜之交

我接触VR比较早。 记得早在2001年左右&#xff0c;瑞典的一家公司&#xff0c;借与上海市政府互访之际&#xff0c;提出与上海市政府在虚拟现实领域的合作。后来上海市政府邀请了上海的几家大型国企&#xff0c;包括汽车、船舶、飞机等&#xff0c;去讨论此事&#xff0c;我作…

electron使用webview出现空白页面解决办法

在使用webview标签的时候&#xff0c;出现了空白页面的情况&#xff0c;刚开始以为没有生效&#xff0c;后来发现页面上是有这个标签的&#xff0c;但是没有展示出内容&#xff0c;后来看了官网&#xff0c;默认情况下&#xff0c;webview标签在 Electron > 5 中被禁用。 &l…

pytorch机器学习各种激活函数总结(不完整学习更新中~)

pytorch各种激活函数总结 0.思维导图预览1. ReLU函数2. Sigmoid函数3. Softmax函数4. Tanh函数5.&#xff08;学习后更新&#xff09; 0.思维导图预览 1. ReLU函数 ReLU&#xff08;Rectified Linear Unit&#xff09;线性整流函数 其公式为&#xff1a; f ( x ) M a x ( 0 …

[python] 基于Dataset库操作数据库

dataset库是Python中一个用于操作数据库的简单库&#xff0c;它提供了一种简洁的方式与各种关系型数据库进行交互&#xff0c;例如SQLite、MySQL、PostgreSQL 等。你可以使用dataset库来执行查询、插入、更新和删除操作&#xff0c;而无需编写复杂的SQL语句。dataset库适用于小…

传感器原理与应用复习--具体场景的应用

文章目录 测量转速测量厚度测量加速度测量液体压强测量含水量测量温度测量流速 测量转速 磁电感应传感器 霍尔传感器 测量厚度 电涡流传感器 测量加速度 应变式传感器 差动变压器式传感器 测量液体压强 电感传感器 电容传感器 测量含水量 半导体传感器 微波传感器…

Prototype原型模式(对象创建)

原型模式&#xff1a;Prototype 链接&#xff1a;原型模式实例代码 注解 模式定义 使用原型实例指定创建对象的种类&#xff0c;然后通过拷贝这些原型来创建新的对象。 ——《设计模式》GoF 目的 在软件系统中&#xff0c;经常面临这“某些结构复杂的对象”的创建工作&am…

Redis的集群模式:主从 哨兵 分片集群

基于Redis集群解决单机Redis存在的问题&#xff0c;在之前学Redis一直都是单节点部署 单机或单节点Redis存在的四大问题&#xff1a; 数据丢失问题&#xff1a;Redis是内存存储&#xff0c;服务重启可能会丢失数据 > 利用Redis数据持久化的功能将数据写入磁盘并发能力问题…