65.9K
CodeProject 正在变化。 阅读更多。
Home

自验证文本框

2007年7月3日

CPOL

7分钟阅读

viewsIcon

93267

downloadIcon

2874

一篇关于在按键时验证输入的文本框的文章

Screenshot - Validating1.jpg

引言

通常,为了维持应用程序的成功运行,特别是涉及会计和数据库的应用程序,有必要控制文本框的输入。这个文本框控制用户可以输入的内容。它通过在 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 属性。这允许设计者选择他们想要的文本框格式,无论是 NumericAlphabetical 还是任何其他模式。

第二个新属性是 ValidInput 属性。在 OnLeaveTextChanged 验证时,如果将某种形式的无效数据输入到文本框中,则 InvalidInput 属性将设置为 false。这让设计者知道何时存在无效数据。

第三个新属性是 AllowNull 属性。如果将其设置为 false,那么如果文本框为空或变空,ValidInput 属性将设置为 false。这让设计者知道数据何时出现问题。

第四个新属性是 DisplayTickOnValid 属性。与正常的错误显示图标不同,这个文本框在用户输入正确时也显示图标,但只有在您需要时才显示。

第五个新属性是 ErrorMessage 属性,将在下一节讨论。

每个人都知道何时出现问题

我觉得在设计这个时,重要的一点是不仅让设计者知道文本框何时抛出错误,还要让用户知道。为了实现这一点,我将 ErrorProvider 添加到文本框中。当验证出现问题时,ErrorProvider 将被设置为显示带有附加错误的提示,即显示在错误图标上方的工具提示。然后文本框将其 ValidInput 属性设置为 false,让设计者知道存在问题。它还会将其 ErrorMessage 属性设置为与 ErrorProvider 关联的错误相匹配。这样做有 3 个好处:

  1. 用户知道何时出现问题,允许用户纠正。
  2. 文本框指示何时出现问题,允许程序中的功能采取正确的操作,例如禁用保存按钮等。
  3. 程序可以访问关联的错误并将其显示给用户,让用户知道哪里出了问题。

事件

每个新属性都关联一个新事件。每个新属性都有一个关联的 PropertyChanged 事件。这很有用,因为设计者可以合并代码来

  1. 允许他们在出现错误时采取行动。
  2. 允许在运行时更改属性并对这些更改做出可用反应。
  3. ErrorMessage 更改时,向用户显示错误消息。

Using the Code

代码大部分很简单。只需将控件编译成 DLL 并将其添加到您的工具箱中。然后您可以在任何您想要的应用程序中使用它。以下是如何将其添加到您的工具箱:

  1. 编译控件。
  2. 右键单击工具箱 -> 选择项 -> 浏览 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.NumberDecimalSeparatorCurrentInfo.NumberGroupSeparatorCurrentInfo.CurrencySymbol

历史

  • 2007 年 7 月 3 日 -- 发布原始版本
  • 2007 年 7 月 6 日 -- 文章更新
  • 2007 年 7 月 9 日 -- 文章更新
  • 2007 年 8 月 7 日 -- 文章和下载更新
© . All rights reserved.