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

RegexTextBox: 一个 Windows 控件库

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (1投票)

2008年6月4日

CPOL

3分钟阅读

viewsIcon

35493

downloadIcon

340

具有正则表达式屏蔽和验证功能的文本框。

引言

这个单一的控件库旨在填补开发者基本工具箱中的空白。RegexTextBox 是一种控件,它根据正则表达式限制用户输入并验证该输入。RegexTextBox 可以添加到工具箱中,并附带其自己的工具箱图像。

先决知识

本文假设您知道如何将控件添加到工具箱中。

背景

作为 Windows 窗体的常用开发者,我发现我经常需要一个文本框,该文本框可以限制用户输入并验证输入。 这是论坛上经常讨论的话题,并且已经发布了各种其他解决方案。 但是,这些解决方案的范围是有限的。 例如,您可以找到一个文本框的解决方案,该文本框仅将输入限制为数字或字母,但是对于一个文本框,它将输入限制为数字 1 到 4 以及字母 A、C 或 F 又如何呢? 引入正则表达式的力量来解决这个问题和 RegexTextBox

使用代码

如果您不熟悉正则表达式,那么现在可能是时候了。 欲了解快速介绍和一些实践经验,请访问 regexlib.com

RegexTextBox 包含两个重要的属性。 第一个也是最重要的属性是 RegexKeysSet。 此属性包含用于标识要接受和拒绝哪个按键的正则表达式。

例如,让我们检查一下我们希望用户输入一个小数的情况。 在这种情况下,我们希望接受以下键:0 到 9 和小数点。

如果您的 RegexTextBox 名为 rgxTextbox,那么我们将像这样设置 RegexKeysSet

rgxTextbox.RegexKeysSet = "^[0-9\.]$"

设置该属性后,RegexTextBox 将仅允许输入这些键。 为了实现这一点,OnKeypress 事件被重写,如下所示

Protected Overrides Sub OnKeypress(ByVal e As System.Windows.Forms.KeyPressEventArgs)  
    Dim keyInput As String = e.KeyChar.ToString() 
    Dim ValidInput As Boolean = True
        If [Char].IsLetterOrDigit(e.KeyChar) Then
            ValidInput = Regex.IsMatch(keyInput, RegexKeysSet)
        ElseIf [Char].IsPunctuation(e.KeyChar) Then
            ValidInput = Regex.IsMatch(keyInput, RegexKeysSet)
        ElseIf [Char].IsSeparator(e.KeyChar) Then
            ValidInput = Regex.IsMatch(keyInput, RegexKeysSet)
        ElseIf [Char].IsSymbol(e.KeyChar) Then
            ValidInput = Regex.IsMatch(keyInput, RegexKeysSet)
        ElseIf [Char].IsWhiteSpace(e.KeyChar) Then
            ValidInput = Regex.IsMatch(keyInput, RegexKeysSet)
        End If

        'if the keyInput is not in RegexKeysSet then consume the key
        If Not ValidInput Then e.Handled = True
End Sub

但是,这并不能阻止用户输入无效文本。 它只是屏蔽输入。 使用上面的示例,可以在 RegexTextBox 中输入以下内容

"00.12.588.12", "145",  ".65"

这就是为什么存在第二个名为 RegexValidText 的属性。 再次使用上面的示例,如果我们要测试有效的小数输入,我们将设置 RegexValidText 属性并调用 IsValidText 方法。

设置 RegexValidText 属性

rgxTextbox.RegexValidText = "^\d*\.?\d*$"

以下示例将更改 RegexTextBox 的背景颜色以指示有效输入

Private Sub rgxTextBox_TextChanged(ByVal sender As System.Object, _ 
            ByVal e As System.EventArgs) Handles rgxTextBox.TextChanged
    If rgxTextBox.IsValidText Then
        rgxTextBox.BackColor = Color.Green
    Else
        rgxTextBox.BackColor = Color.Red
    End If
End Sub

如果您需要阻止输入无效文本,那么您将需要添加一些自己的代码。 这种被动的验证方法使我可以选择我想对无效输入做什么以及何时对其进行测试。

关注点

此控件的功能限制仅受您对正则表达式的创造力的限制。 即使您不是正则表达式的大师,您也可以随时搜索适合您需求的表达式,然后自己编写 RegexKeysSet 的表达式(一旦您掌握了它,就相对简单)。

© . All rights reserved.