自验证文本框






2.85/5 (8投票s)
一篇关于在按键时验证输入的文本框的文章
引言
通常,为了维持应用程序的成功运行,特别是涉及会计和数据库的应用程序,有必要控制文本框的输入。这个文本框控制用户可以输入的内容。它通过在 KeyPress
事件上验证输入字符来实现这一点。它有九种模式,在不同情况下都很有用,可以通过设计时或运行时更改 ValidationFormat
属性来改变。
与其他验证文本框不同,所有这些操作都在 KeyPress
事件上完成。因此,用户不可能输入错误的数据。虽然它具有与掩码文本框相似的元素,但它提供了字母数字、十进制、货币和独特的首字母大写功能。首字母大写功能在用户将姓名输入到您的字段时非常有用。这样,当信息存储时,即使忘记了用途,它也以正确的格式存储。
注意:这是在 Visual Studio 2005 中使用 .NET Framework 2.0 在 Windows XP 上创建的。
特点
9 种 ValidationFormat 模式
None
:允许任何字符。Alphabetical
:只允许字母。Numeric
:只允许数字。Alphanumeric
:只允许字母和数字。Decimal
:允许数字和一个小数点。适应不同地区的货币符号和分隔符。CapitaliseEachWordAlphabetical
:只允许字母,并将每个单词的首字母大写。CapitaliseEachWordAlphanumeric
:只允许字母和数字,并将每个单词的首字母大写。CapitaliseEachWordAll
:允许任何字符,并将每个单词的首字母大写。Currency
:只允许数字、一个货币符号、一个小数点分隔符和无限个千位分隔符。适应不同地区的货币符号和分隔符。UpperCaseAlphabetical
:只允许大写字母;小写字母将被转换为大写。UpperCaseAlphabetical
:只允许大写字母和数字;小写字母将被转换为大写。LowerCaseAlphabetical
:只允许小写字母;大写字母将被转换为小写。LowerCaseAlphabetical
:只允许小写字母和数字;大写字母将被转换为小写。
在 KeyPress、Leave 和 TextChanged 上进行验证
此控件的验证分 3 个阶段完成。第一个阶段是在 KeyPress
事件上。如果用户输入的键不被 ValidationFormat
允许,该键将简单地被拒绝。第二个验证阶段发生在 Leave
事件上。当文本框失去焦点时,它会检查文本框的内容是否正确,以防意外引入不需要的字符。在第三个阶段,控件在 TextChanged
事件上进行验证。这最后一个阶段在用户在文本框中执行粘贴操作时生效。
新属性
与标准文本框相比,此文本框有五个新属性,每个属性在验证中都有不同的作用。第一个新属性当然是 ValidationFormat
属性。这允许设计者选择他们想要的文本框格式,无论是 Numeric
、Alphabetical
还是任何其他模式。
第二个新属性是 ValidInput
属性。在 OnLeave
或 TextChanged
验证时,如果将某种形式的无效数据输入到文本框中,则 InvalidInput
属性将设置为 false。这让设计者知道何时存在无效数据。
第三个新属性是 AllowNull
属性。如果将其设置为 false,那么如果文本框为空或变空,ValidInput
属性将设置为 false。这让设计者知道数据何时出现问题。
第四个新属性是 DisplayTickOnValid
属性。与正常的错误显示图标不同,这个文本框在用户输入正确时也显示图标,但只有在您需要时才显示。
第五个新属性是 ErrorMessage
属性,将在下一节讨论。
每个人都知道何时出现问题
我觉得在设计这个时,重要的一点是不仅让设计者知道文本框何时抛出错误,还要让用户知道。为了实现这一点,我将 ErrorProvider
添加到文本框中。当验证出现问题时,ErrorProvider
将被设置为显示带有附加错误的提示,即显示在错误图标上方的工具提示。然后文本框将其 ValidInput
属性设置为 false,让设计者知道存在问题。它还会将其 ErrorMessage
属性设置为与 ErrorProvider
关联的错误相匹配。这样做有 3 个好处:
- 用户知道何时出现问题,允许用户纠正。
- 文本框指示何时出现问题,允许程序中的功能采取正确的操作,例如禁用保存按钮等。
- 程序可以访问关联的错误并将其显示给用户,让用户知道哪里出了问题。
事件
每个新属性都关联一个新事件。每个新属性都有一个关联的 PropertyChanged
事件。这很有用,因为设计者可以合并代码来
- 允许他们在出现错误时采取行动。
- 允许在运行时更改属性并对这些更改做出可用反应。
- 当
ErrorMessage
更改时,向用户显示错误消息。
Using the Code
代码大部分很简单。只需将控件编译成 DLL 并将其添加到您的工具箱中。然后您可以在任何您想要的应用程序中使用它。以下是如何将其添加到您的工具箱:
- 编译控件。
- 右键单击工具箱 -> 选择项 -> 浏览 DLL -> 添加并应用 -> 使用控件。
然而,这个控件最有用的部分是我添加的新 ValidInput
属性。当文本框失去焦点时,它会通过对其当前的 ValidationFormat
运行检查来验证其内容是否有效。如果检查返回一个指定输入无效的值,则 ValidInput
属性将设置为 False
。当用户继续或提交数据时,您的程序可以检查文本框。它会查看它们是否都有效,并允许或不允许继续。此外,该控件还包含一个内置的 ErrorProvider
,它将向用户显示他们的输入无效,给他们一个更改的机会。
代码(或部分代码)
关于全球化的声明
Imports System.Globalization.NumberFormatInfo
Dim DSep As String =
CurrentInfo.NumberDecimalSeparator
' finds decimal separator for local region
Dim GSep As String =
CurrentInfo.NumberGroupSeparator
' finds group separator for local region
Dim CSym As String =
CurrentInfo.CurrencySymbol
' finds currency symbol for local region
字母
If Char.IsLetter(e.Keychar) = False Then
e.Handled = True
End If
数值
If Char.IsNumber(e.Keychar) = False Then
e.Handled = True
End If
字母数字
If Char.IsLetterorDigit(e.Keychar) = False Then
e.Handled = True
End If
十进制
If Char.IsNumber(e.KeyChar) = False Then
If e.KeyChar = CChar(DSep) Then
If Me.Text.Contains(DSep) Then '
e.Handled = True ' Allows only one decimal separator
End If '
Else
e.Handled = True
End If
End If
检查 Allow Null 并采取适当行动
如果文本框的文本属性为空。
If Me.AllowNull = True Then
Valid()
Else
Me.InvalidErrorProvider.SetError(Me,
"Invalid Input: This textbox must not be empty.")
Invalid()
End If
Private Sub Valid()
Me.InvalidErrorProvider.Clear()
Me.ErrorMessage = Nothing
Me.ValidInput = True
End Sub
Private Sub Invalid()
Me.ErrorMessage = Me.InvalidErrorProvider.GetError(Me)
Me.ValidInput = False
End Sub
其余代码太长,无法在一个大块中发布。
关注点
首字母大写是最难做对的部分,因为变量太多。如果用户决定退格,它必须检查是否需要大写。然后它必须大写第一个字母并检查——在某些情况下——它是否是一个字母。协调所有这些有点棘手,而且可能有点混乱,所以请随意整理代码。我发现一个有趣的事情是,对于退格和空格,必须为退格和空格字符设置异常,因为它们与特殊字符一起被阻塞。
我必须关注的一个重要事项,我最初没有考虑到的,是管理货币字段。特别是,我需要考虑如何输入货币值以及输入哪些货币值。由于不同国家使用不同的货币格式,因此有必要利用 System.Globalization
命名空间并处理它提供的不同元素以实现国际兼容性。其中包括 CurrentInfo.NumberDecimalSeparator
、CurrentInfo.NumberGroupSeparator
和 CurrentInfo.CurrencySymbol
。
历史
- 2007 年 7 月 3 日 -- 发布原始版本
- 2007 年 7 月 6 日 -- 文章更新
- 2007 年 7 月 9 日 -- 文章更新
- 2007 年 8 月 7 日 -- 文章和下载更新