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

使用 MC++ 的自定义文本框(带正则表达式验证)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.35/5 (11投票s)

2004年10月4日

8分钟阅读

viewsIcon

90929

downloadIcon

1354

使用 VC++.NET 编写的自定义 TextBox,支持输入验证,并引导您完成构建自定义控件所需的步骤。

1. 引言

本文的出发点是这样一个场景:我们正在为用户开发某个应用程序,并且在应用程序的 GUI 中,我们使用了几个 TextBox 控件来接收用户的输入。很多时候,这些输入需要遵循特定的格式。例如,我们希望用户输入的邮政编码是“30022”这样的格式;地址应该看起来像“2025 roadName Rd”或“931 roadName”;用户提供的电子邮件地址必须是“name@something.com”这样的格式,等等。我们当然可以在接收了每个 TextBox 控件的文本后添加不同的验证代码,但一个更好的解决方案是拥有一个使用正则表达式验证用户输入的 TextBox 控件,因为正则表达式似乎足够强大,可以描述我们日常生活中遇到的几乎所有格式。我们所需要做的就是为 TextBoxregularExpression 属性指定一个正则表达式,这样它就可以为我们验证用户输入了——试想一下,如果没有正则表达式,要验证一个合法的电子邮件地址需要编写多少行代码!

如果您正在开发 ASP.NET 应用程序,已经有一个控件可以使用正则表达式验证输入。然而,对于 Windows Forms,TextBox 控件没有 regularExpression 属性,因此不提供此验证功能。因此,解决方案是构建我们自己的自定义 TextBox 控件,它有一个 regularExpression 属性,并使用此正则表达式验证输入。构建完成后,我们可以将其添加到 IDEToolBox 中,并在需要验证输入文本时使用它。这正是我们将在本文中要完成的:在接下来的几节中,我将逐步介绍构建此自定义控件所需的步骤,并且还提供了一个小的测试项目来展示如何使用新构建的控件。

社区中有很多关于同一问题的文章,但是,没有一个控件是用 VC++.NET 编写的,也没有一篇文章详细介绍了实现这一目标所需的步骤——这些步骤对于读者进行自己的改进似乎很有帮助。在下一节中,我将展示构建此自定义控件的所有步骤以及您需要添加到控件中的所有必要代码。在最后一节中,我将讨论一个简单的测试项目以及我用来验证示例输入的正则表达式。

2. 分步:构建自定义 TextBox 控件

本节将介绍构建自定义控件所需的步骤,该自定义控件直接继承自 .NET ToolBox 中提供的原始 TextBox 控件。如果您熟悉这些步骤,可以跳过本节,直接下载本文提供的 .dll 文件,并希望您决定将其用于自己的开发中。

步骤 1

创建一个新项目,类型为 Windows Control Library(.NET),将项目命名为 ValidatingTextBox(我不擅长命名,所以随意使用您喜欢的名字!)。

请注意,我们选择的项目类型为 Control Library,这将为我们提供一个 .dll 文件,在这种情况下,它将是一个通用的自定义控件,我们可以在其他应用程序中使用。

第二步

打开 ValidatingTextBoxControl.h,找到以下行

public __gc class ValidatingTextBoxControl : 
   public System::Windows::Forms::UserControl

UserControl 更改为 TextBox,因此上述行应如下所示

public __gc class ValidatingTextBoxControl : 
   public System::Windows::Forms::TextBox

这是必要的,因为我们的自定义控件仍然是一个 TextBox,具有使用正则表达式的验证功能。此更改将确保 ValidatingTextBoxControl 直接继承自 TextBox

步骤 3

由于我们将使用 .NET 的正则表达式支持,所以在 using namespace 部分添加以下行

using namespace System::Text::RegularExpressions;

步骤 4

添加以下 private 成员和必要的属性

private:
  String* regularExpression;

public:
  __property String* get_RegularExpression()
  {
    return regularExpression;
  }

  __property void set_RegularExpression(String* regExpValue)
  {
    regularExpression = regExpValue;
  }

这将确保当我们.NET 应用程序中使用 ValidatingTextBoxControl 时,我们将在其 Properties 窗口中看到一个 RegularExpression 项目,并且我们可以像编辑控件的任何其他属性一样编辑此属性。

步骤 5

由于我们添加了一个 private 成员 regularExpression,因此我们需要对 ValidatingTextBoxControl 类的构造函数进行一些更改

public:
  ValidatingTextBoxControl(void)  
  {
    InitializeComponent();
    this->regularExpression = 0;
    this->CausesValidation = true;
  }

步骤 6

现在是真正重要的一部分:验证部分。添加以下 private 成员函数

private: bool isValid()
{
   if ( regularExpression == 0 ) return true;
   Match* theMatch = Regex::Match(this->Text,regularExpression);
   if ( theMatch->Success && theMatch->Length == this->Text->Length )
      return true;
   else return false;
}

显然,如果 regularExpression 属性从未在 Properties 窗口中编辑过,则验证始终返回 true 值,否则,将使用 Regexstatic 方法 Match() 来测试用户输入是否满足 regularExpression 指定的格式。此外,Length 的比较也很重要:值为“\d{5}”(用于邮政编码)的 regularExpression 不仅会匹配 30022,还会匹配 30022abc。为了避免这种情况,我们需要进行 Length 比较。

步骤 7

我们需要重写基类的 OnValidating(CancelEventArg* e)。这是上面 isValid() 函数被调用的地方

protected: void OnValidating(CancelEventArgs* e)
{
   if ( isValid() == false )
   {
      // Cancel the event and select the text to be corrected by the user.
      e->Cancel = true;
      MessageBox::Show( String::Concat(S"\"", this->Name, S"\" is not correct"),
                        S"Error: invalid input value",
                        MessageBoxButtons::OK,MessageBoxIcon::Error);
      return;
   }
   __super::OnValidating(e);
}

这也将确保,如果用户输入不正确,应用程序不会继续,并且会弹出一个简单的消息框,告知用户错误是什么以及正确的格式是什么(您可能希望更改此设置,使其消失或更有用)。

步骤 8(最后一步)

现在我们可以构建项目了,如果一切正常,我们将获得一个 ValidatingTextBox.dll,这就是最终产品:它是一个通用的自定义 TextBox 控件,可以使用给定的正则表达式来验证用户输入。

在下一节中,将介绍一个小的测试项目,展示如何将这个新创建的控件“插入”到 .NET IDEToolBox 中,以及如何使用它。事实上,这很简单:您可以像使用任何其他控件一样使用它!

3. 测试示例

让我们按照以下步骤构建一个示例测试项目,看看如何使用我们新创建的控件

步骤 1

创建一个新的项目,类型为 Windows Forms Application(.NET),将项目命名为 testValidatingTextBox

第二步

导入 ValidatingTextBox:在新项目中,右键单击 ToolBox 区域,然后选择 Add/Remove Items... 菜单。将出现一个对话框,在该对话框中,选择 .NET Framework Components 选项卡。单击 Browse... 按钮找到我们刚刚构建的 ValidatingTextBox.dll,然后 **打开** 它。这将把这个自定义控件添加到组件列表中,并确保此控件旁边的复选框已选中。单击 OK。现在您将在 ToolBox 列表中看到 ValidatingTextBoxControl,并且可以像添加任何其他控件一样将其添加到窗体中。

步骤 3

构建一个简单的 GUI,其中包含以下 3 个输入文本框:邮政编码、地址和电子邮件帐户(请参阅本文开头的截图)。请注意,我们在这种简单 GUI 中使用的 TextBox 控件是我们刚刚在第 2 节中构建的 ValidatingTextBoxControl,并且我们可以像使用原始 TextBox 控件一样使用它。但是,它唯一特殊的地方(也是我们构建它的原因)是,为了验证用户输入,我们需要为这 3 个输入中的每一个指定 RegularExpression 属性:本文开头的屏幕截图显示了我们为地址输入使用的正则表达式

^[0-9]+\s+([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$

这个正则表达式表示正确的地址必须以至少 1 个数字(从 09)开头,后跟至少一个空格(可以有多个),然后应该有一个字母,或者,在此字母(们)之后,可以有一个空格,后跟至少另一个字母。因此,以下地址都是正确的:123 peachtree,或 123 peachtree rd,但以下地址无效:Pearchtree 123123 等。

相应地,让我们为邮政编码和电子邮件帐户指定正则表达式。对于邮政编码,我们使用 \d{5},这表示邮政编码必须恰好是 5 位数字;对于电子邮件帐户,我们使用 [0-9a-zA-Z]+@[0-9a-zA-Z]+\.com,这表示电子邮件帐户必须以数字或字母开头,后跟一个 @,然后是一些其他数字或字母,最后是 .com(您也可以允许 .net.org 等)。

步骤 4

构建项目并进行尝试。现在您可以开始在文本框中输入文本了。如果您输入了错误的内容,将弹出一个消息框,告知您该特定文本框的正确格式。

这些是如何导入自定义控件以及如何在我们的开发工作中使用的基本步骤。正则表达式的一个问题是,如果您指定了一个错误的表达式,控件不会告诉您——它根本不起作用,并且还会阻止您继续输入。因此,现在由您来提供正确的表达式!

4. 就是这样!

本文介绍了一个自定义 TextBox 控件,它具有一个 RegularExpression 属性,您可以使用该属性来验证任何用户输入的文本。在本文中,我们逐步介绍了构建自定义控件所需的步骤,并且还构建了一个测试项目来展示如何导入自定义控件以及如何在应用程序中使用它。您可以直接下载 .dll 文件并在您的工作中进行使用,但也非常欢迎您下载源代码,以便您可以进行更改并添加更多功能,我当然期待您的改进和评论。

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.