C# MaskedEdit 控件






3.84/5 (25投票s)
C# MaskedEdit 控件,
引言
Visual Studio.NET 和 .NET Framework 包含许多非常有用的控件。不幸的是,其中并没有掩码编辑控件。任何使用过 VS 6.0 掩码编辑控件的人都知道,微软上次的尝试并非没有问题。MS Access 开发者一直拥有一个可用的掩码编辑控件。我有时想知道为什么微软没有将 Access 控件适配到他们的其他工具中。无论如何,我决定解决这个非常有用但缺失的控件。
在花费数小时处理基于 TextBox 的控件中的字符选择后,我开始明白为什么有人会避免构建这个控件。然后是设置 MaskedEdit 控件的值,这带来了一系列新的挑战。构建一个万无一失的 MaskedEdit 的难度很快变得显而易见——所以这是一个公平的警告,不要忘记测试、测试、再测试。
背景
MaskedEdit 控件大致基于 Access 的掩码行为,并包含以下功能:
- 标准输入掩码
- 社会安全号码 (SSN)
- 电话号码
- 邮政编码
- 自定义输入掩码
- 运行时可更改的输入掩码
- IsValid 属性
- Text 属性(包含文字)
- Value 属性(不包含文字)
- Input Char 属性(默认为 '_')
使用 MaskedEdit 控件
以下字符已被定义为 MaskedEdit 控件的掩码字符
- 0 - 必填数字
- 9 - 可选数字
- L - 必填小写字母 (a-z)
- l - 可选小写字母
- U - 必填大写字母 (A-Z)
- u - 可选大写字母
- A - 必填任意大小写字母
- a - 可选任意大小写字母
- D - 必填字母或数字
- d - 可选字母或数字
- C - 任意字符,包括标点符号
如果您不熟悉掩码字符,可以在 MSDN 库中“InputMask Property”下找到相关信息
正则表达式用于定义上面的每个掩码字符。例如,'0' 和 '9' 掩码字符编码如下:
m_regexps.Add('0', @"[0-9]"); // digit required m_regexps.Add('9', @"[0-9 ]"); // digit/space not required
您可以在 MaskedEdit 控件的源代码中找到所有其他掩码字符的正则表达式。空格字符 ' ' 用作可选字符。MaskedEdit 控件其他部分的验证代码使用空格字符来确定是否需要输入。如果您决定定义自己的输入掩码字符,这是一个关键考虑因素。
我定义的输入掩码字符基本上是数字、大小写字母以及任意掩码字符 'C' 的组合。我认为这些应该适用于许多情况,但如果您需要更精细的输入限制,MaskedEdit 控件可以处理。例如,假设您需要输入十六进制值。目前没有任何输入掩码字符可以处理十六进制数字(0 到 9 加 A 到 F)。因此,让我们为十六进制数字添加一个新的掩码字符,它看起来像这样:
m_regexps.Add('H', @"[0-9A-F]"); // hex digit required
这个正则表达式将允许这些字符中的任何一个:"0123456789ABCDEF"。因此,一个 16 位十六进制值的 InputMask 可能看起来像 "\0xHHHH",将显示为 0x____,有 4 个位置用于十六进制数字输入。这意味着您可以调整 MaskedEdit 控件以处理新的输入要求。别忘了,如果您添加一个输入掩码字符 '-',标准 InputMasks 将受到不利影响。
如果您密切关注,您可能会对上面的 InputMask 有疑问。'\' 字符是什么?如果您需要添加一个已被定义为掩码字符的文字字符,那么您需要使用转义字符 '\'。这使得 MaskedEdit 控件将下一个 InputMask 字符视为文字而不是输入掩码字符。例如,假设我们希望 InputMask 允许用户输入以下形式的零件号:
UL-1234
其中 UL- 是文字,1234 代表必填数字。'U' 和 'L' 都是用于大写和小写字符的输入掩码字符。添加文字 'U' 或 'L' 意味着我们必须添加转义字符以将其指定为文字而不是输入掩码字符,因此我们的 InputMask 将是:
\U\L-0000
请注意,'-' 不需要转义字符前缀,因为它没有被定义为掩码字符。
MaskedEdit 属性
接下来,我们看看如何获取和设置 MaskedEdit 控件中包含的值。
Text 属性 - 此属性设置/获取控件中包含的整个字符串,包括文字。因此,一个包含如下数据的 SSN 输入掩码,例如:
123-45-6789
将返回 "123-45-6789"。
Value 属性 - 此属性仅设置/获取控件中的输入字符,不包括文字。因此,上面的示例将返回 "123456789"。Value 属性不返回用户未输入的可选字符,例如:
(___) 123-4567
输入到电话号码掩码中,Value 属性将返回 "1234567"。可选输入掩码字符会导致一些我已努力解决的有趣问题。我建议使用 MaskedEditTest 应用程序来测试您计划使用的任何 InputMask,以确保它按您预期的方式工作。
MaskedEdit 的其余属性都相当直观。
- IsValid 属性 - 如果所有必填输入字符都已正确输入,则返回 true。
- InputChar 属性 - 默认为 '_' 下划线字符,但可以设置为除输入掩码字符或转义字符之外的任何其他字符。
- ErrorInvalid 属性 - 默认为 false。将其设置为 true 将导致 MaskedEdit 控件在尝试将 Text 或 Value 属性设置为无效字符串时抛出错误。在调试期间将其设置为 true 可能非常有用。
- StdInputMask 属性 - 枚举以选择标准输入掩码,包括
- None - 使 MaskedEdit 控件像标准文本框一样工作
- 社会保险号
- 电话
- Zip
- Custom - 使用此项定义自定义输入掩码
- InputMask 属性 - 使用此项设置自定义 InputMasks。InputMask 可以在运行时更改。MaskedEdit 控件尝试将当前文本转换为新掩码。这很可能会导致问题。如果您需要在运行时重置掩码,我建议在重置 InputMask 之前将 Value 设置为空字符串。
使用注意事项
MaskedEdit 应该很适用于输入“已知”值,例如 SSN、电话和邮政编码。重要的是用户必须知道要输入什么,因为掩码不会给出任何关于预期输入类型(数字?字母字符????)的线索。工具提示或帮助文件可能有助于解释复杂的输入掩码。在用户输入无效字符时提供消息是一种可能的改进。我正在考虑添加一个 InValid 事件和一个 InValidMessage 属性,以允许开发者添加在无效输入期间触发的自定义消息。请告诉我您的想法。
将 InputMask 设置为仅包含文字字符会使其成为标签控件。我曾考虑为此可能性添加处理,但最终决定放弃。如果您尝试这样做,请准备好捕获错误 :-\
MaskedEdit 控件中的字符选择旨在将选择仅保留在输入字符上,并跳过文字。这导致了一种有些特殊的选择行为。
基类 TextBox 具有大量的属性。我已经为其中一些我知道会影响 MaskedEdit 控件的属性添加了处理。可能还有其他我没有考虑到的属性会导致问题或错误。如果您发现任何问题,请发帖说明。
待办事项
- 测试、测试、再测试 我在测试这个控件上花费了比我愿意承认的更多的时间,但任何如此复杂的事物都可能存在未发现的错误。如果您发现任何错误,请发帖说明。
- 添加数据绑定功能。我希望绑定 Text、Value 和 InputMask 属性。请告诉我您对此的看法。
- MS Access 有一个自动大写/小写输入的功能:'<' = 小写,'>' = 大写。此功能未包含在 MaskedEdit 控件中。如果您需要此功能,请告诉我,我将在 Rev. 2 中努力添加它。
历史
- 1.0 版于 2003 年 4 月 2 日发布