Hinzufügen der Validierung regulärer Ausdrücke

 

Duncan Mackenzie
Microsoft Developer Network

Mai 2002

Zusammenfassung: Behandelt die Grundlagen des Erbens von einem anderen Steuerelement und hinzufügen eigener Eigenschaften, Methoden und Ereignisse sowie des Hinzufügens ihres eigenen Codes. eines von einer Reihe von Microsoft Windows Forms Entwicklungsbeispielen, die zusammen mit dem zugehörigen Übersichtsartikel gelesen werden sollen. (12 gedruckte Seiten)

Laden Sie WinFormControls.exeherunter.

Dieser Artikel ist der zweite in einer Fünf-Artikel-Reihe zum Entwickeln von Steuerelementen in Microsoft® .NET:

Inhalte

Einführung
Beispiel 1a: Hinzufügen der Validierung regulärer Ausdrücke zum TextBox-Steuerelement
Eine kurze Diskussion zu regulären Ausdrücken
Was muss ich erstellen?
Beispiel 1b: Hinzufügen der Validierung regulärer Ausdrücke als alternative Methode
Zusammenfassung

Einführung

In diesem Artikel werden zwei Beispiele behandelt: das Erstellen eines benutzerdefinierten TextBox-Steuerelements , das die Validierung regulärer Ausdrücke ausführt, und das Erstellen eines Extenderanbieters, der eine andere Methode verwendet, um dieselbe Validierung regulärer Ausdrücke durchzuführen.

Beispiel 1a: Hinzufügen der Validierung regulärer Ausdrücke zum TextBox-Steuerelement

Im Übersichtsartikel habe ich Ihnen gezeigt, wie Sie das TextBox-Steuerelement schnell verbessern, um nur numerische Daten zu akzeptieren, wodurch ein neues Steuerelement mit einem minimalen Arbeitsaufwand erstellt wird. Dieses Beispiel sollte nur veranschaulichen, wie schnell ein Steuerelement durch die Verwendung von Vererbung erstellt werden kann, daher war es ziemlich begrenzt. Für mein erstes Beispiel zeige ich Ihnen, wie Sie ein Steuerelement erstellen, das dieses Ziel auf elegantere Weise erreicht. Anstatt dieses Steuerelement einfach zu erweitern, um Währungen und andere numerische Formate zu unterstützen, besteht ein besserer Ansatz darin, ein generischeres Steuerelement zu erstellen, um die Texteingabe einzuschränken. Wenn Sie ASP.NET (Web)-Anwendungen erstellen, wurde bereits ein Steuerelement bereitgestellt, um genau das zu erreichen, was ich beschreibe: das RegularExpressionValidator-Steuerelement, das in der .NET Framework Allgemeine Referenz dokumentiert ist. Mit diesem Steuerelement können Sie die Texteingabe auf ein beliebiges Format beschränken, das mit einem regulären Ausdruck beschrieben werden kann, d. h. auf ein beliebiges Format. Da eine Version dieses Steuerelements nicht für die Verwendung in Windows Forms bereitgestellt wurde, ist es ein hervorragendes Beispiel für ein benutzerdefiniertes Steuerelement, das Sie erstellen können– ein Windows Form-Textfeld, das seinen Inhalt anhand eines regulären Ausdrucks überprüft.

Eine kurze Diskussion zu regulären Ausdrücken

Bevor ich in die Steuerungsentwicklung einspringe, sind Sie vielleicht daran interessiert, etwas über reguläre Ausdrücke zu erfahren. Im Folgenden finden Sie einige Ressourcen, die Ihnen helfen:

  • Reguläre Ausdrücke von .NET Framework
    Dieser Abschnitt der .NET Framework Dokumentation enthält sowohl eine Einführung in das Konzept und den Zweck von regulären Ausdrücken als auch einen Verweis auf die Verwendung der relevanten Klassen innerhalb des Frameworks.
  • Beispiele für reguläre Ausdrücke auf der Website der Bibliothek für reguläre Ausdrücke
    Nachdem Sie das Material in der .NET Framework-Dokumentation gelesen haben, bietet diese Website eine große Liste von regulären Beispielausdrücken, die Sie verwenden können.

Was muss ich erstellen?

Um mein überprüfendes TextBox-Element zu erstellen, muss ich einige verschiedene Schritte ausführen. Zunächst muss ein neues leeres Steuerelement erstellt werden, das von TextBox erbt. Als Nächstes wird eine neue Eigenschaft hinzugefügt, die den regulären Ausdruck enthält, für den überprüft werden soll, und eine private Funktion wird geschrieben, die den Inhalt des TextBox-Objekts anhand der Eigenschaft für reguläre Ausdrücke überprüft. Schließlich kann ich durch Überschreiben des OnValidating-Ereignisses des Steuerelements überprüfen, ob der Inhalt des Steuerelements gültig ist, und das Ereignis abbrechen.

Schritt 1: Erstellen eines neuen benutzerdefinierten Steuerelements

Wenn Sie Steuerelemente für sich selbst oder andere Benutzer entwickeln, empfiehlt es sich, sie in ein eigenes Projekt zu integrieren, sodass sie als kompilierte Assembly (in diesem Fall eine DLL) freigegeben werden können, anstatt den Code zu übergeben. In diesem Sinne erstelle ich ein neues Windows-Steuerelementbibliotheksprojekt, das das neue Steuerelement enthält, und dann ein reguläres Windows-Anwendungsprojekt in derselben Projektmappe, um das Testen des Steuerelements zu vereinfachen. Wenn Sie ein neues Windows-Steuerelementbibliotheksprojekt erstellen, wird standardmäßig ein neues leeres Benutzersteuerelement als Ausgangspunkt hinzugefügt. In diesem Fall möchte ich kein Benutzersteuerelement verwenden, da ich von einem vorhandenen Steuerelement erbe. Daher lösche ich diese Datei und füge einfach eine neue Klassendatei hinzu.

Hinweis Sie können auch einfach die Codeansicht für das Element Benutzersteuerung öffnen, den gesamten Code löschen und dann einen eigenen hinzufügen, anstatt das Element zu löschen und eine neue Klassendatei hinzuzufügen.

Um als Nächstes anzugeben, dass diese neue Klasse von der TextBox-Klasseerben soll, füge ich der leeren Klasse, die Microsoft® Visual Studio® .NET erstellt, eine Inherits-Anweisung hinzu:

Public Class RegExTextBox
    Inherits System.Windows.Forms.TextBox

End Class

Mit nur diesem kleinen Code habe ich bereits meine eigene Version von TextBox erstellt, indem ich vom vorhandenen Steuerelement geerbt habe. Da ich keinen eigenen Code hinzugefügt habe, würde dieses neue Steuerelement genau wie ein normales TextBox-Steuerelement aussehen und sich verhalten. Durch das Vererben ändert sich nichts, bis Sie mit dem Hinzufügen von Code oder Attributen beginnen.

Schritt 2: Hinzufügen einer neuen Eigenschaft

Der nächste Schritt beim Erstellen dieses Steuerelements besteht darin, eine neue String-Eigenschaft hinzuzufügen, die die Anweisung für reguläre Ausdrücke enthält. Um kreativ zu sein, nenne ich es RegularExpression, und zusätzlich zur Eigenschaft selbst erstell ich auch eine interne Variable, die den Wert der Eigenschaft m_RegularExpression. Obwohl diese Klasse ein Windows Form-Steuerelement beschreibt, unterscheidet sich das Hinzufügen einer neuen Eigenschaft nicht vom Hinzufügen zu einer anderen Microsoft Visual Basic® .NET-Klasse:

    Private m_RegularExpression As String

    Public Property RegularExpression() As String
        Get
            Return m_RegularExpression
        End Get
        Set(ByVal Value As String)
            m_RegularExpression = Value
        End Set
    End Property

Um diese neue Eigenschaft zu verwenden und die Gültigkeit der TextBox-Inhalte zu überprüfen, verwenden Sie den System.Text.RegularExpressions-Namespace. Anhand der Beispiele für diese Referenzdokumentation kann ich ein neues RegEx-Objekt erstellen, das die RegularExpression-Eigenschaft im Konstruktor angibt, und dann dieses Objekt verwenden, um zu überprüfen, ob die TextBox-Inhalte mit dem Ausdruck übereinstimmen:

    'added a Imports System.Text.RegularExpressions to the 
    'top of the class to simplify the code
    Private Function IsValid(ByVal Contents As String) As Boolean
        Dim myRegEx As New Regex(RegularExpression)
        Dim myMatch As Match
        myMatch = myRegEx.Match(Contents)
        Return myMatch.Success
    End Function

Wenn ich das Steuerelement an diesem Punkt ausprobieren könnte, würde ich feststellen, dass dieser Code nicht korrekt ist, da er True zurückgibt, wenn eine Übereinstimmung innerhalb der Zeichenfolge gefunden wird. Mit diesem Code würde ein regulärer Ausdruck, der fünfstellige Postleitzahlen finden soll, mit den ersten fünf Ziffern in einer Zeichenfolge wie "23434fred" übereinstimmen, obwohl der zusätzliche Text am Ende hinzugefügt wurde. Wir möchten tatsächlich testen, ob die Zeichenfolge und der Ausdruck genau übereinstimmen. Wenn Sie eine Überprüfung hinzufügen, um sicherzustellen, dass die gefundene Übereinstimmung gleich der gesamten Zeichenfolge ist, funktioniert diese Routine ordnungsgemäß. Gleichzeitig habe ich diesen Test auch in einen sehr einfachen Fehlerbehandlungsblock eingeschlossen, sodass ein ungültiger RegularExpression den Rückgabewert False verursacht:

    'added a Imports System.Text.RegularExpressions to the 
    'top of the class to simplify the code
    Private Function IsValid(ByVal Contents As String) As Boolean
        Try
            Dim myRegEx As New Regex(RegularExpression)
            Dim myMatch As Match
            myMatch = myRegEx.Match(Contents)
            If myMatch.Success _
              AndAlso myMatch.Index = 0 _
              AndAlso myMatch.Length = Contents.Length Then
                Return True
            Else
                Return False
            End If
        Catch
            'some form of error in parsing the pattern
            Return False
        End Try
    End Function

Dieser Code gibt nur True zurück, wenn die Übereinstimmung gefunden wird, und deckt die gesamte Länge der Inhaltszeichenfolge ab, was genau das ist, was ich möchte.

Schritt 3: Überschreiben von OnValidating

Windows Forms-Steuerelemente bieten eine Vielzahl von Methoden und Ereignissen, die sich bereits mit der Validierung befassen. Daher scheint es angebracht, meinen neuen RegularExpression-Check in dieses vorhandene Modell einzupassen, indem Sie die TextBox-Inhalte in der OnValidating-Methode überprüfen. Diese Methode wird aufgerufen, wenn das Steuerelement den Fokus verliert und die CausesValidation-Eigenschaft des Steuerelements gleich True ist. Um dieses Steuerelement auch dann nützlich zu machen, wenn Validation nicht verwendet wird (CausesValidation = False), wird auch eine schreibgeschützte Eigenschaft (Gültig) hinzugefügt, um die direkte Überprüfung auf gültigen Inhalt zu unterstützen:

    Public ReadOnly Property Valid() As Boolean
        Get
            Return IsValid(Text)
        End Get
    End Property
    Protected Overrides Sub OnValidating(ByVal e As _
      System.ComponentModel.CancelEventArgs)
        If Not Valid() Then
            e.Cancel = True
        End If
        MyBase.OnValidating(e)
    End Sub

Fügen Sie den gesamten Code zusammen, und Sie haben eine vollständige Kontrolle, die Sie ausprobieren können. Erstellen Sie das Steuerelementprojekt, und wechseln Sie dann zum Testprojekt (eine Windows-Anwendung, die der gleichen Projektmappe hinzugefügt wurde), fügen Sie einen Verweis auf Ihr RegExTextBox-Projekt hinzu, und passen Sie die Toolbox an, um Ihr neues Steuerelement anzuzeigen. Nachdem Sie das neue TextBox-Objekt ihrem Windows Form hinzugefügt haben, können Sie das Standardeigenschaftenfenster verwenden, um die RegularExpression-Eigenschaft des Steuerelements zu bearbeiten. Einige Beispiele für reguläre Ausdrücke, die Sie möglicherweise ausprobieren möchten, sind hier aufgeführt:

  • Einfache Postleitzahl, überprüft auf 5 numerische Ziffern: "\d{5}".
  • Datumsformat, überprüft auf MM/TT/JJJJ: "\d{1,2}\/\d{1,2}/\d{4}".
    Beachten Sie, dass die Werte nicht überprüft werden, nur das Format, sodass 34/58/2341 vollkommen korrekt wäre, auch wenn es sich nicht um einen ordnungsgemäßen Datumswert handelt.

Einfügen von Eigenschaften in Kategorien und Hinzufügen einer Toolbox-Bitmap

Die Verwendung des Steuerelements in einem anderen Projekt zeigt einige kosmetische Details, die geändert werden müssen, damit es professionell aussieht. Das erste Problem besteht darin, dass unsere Eigenschaften unten in der Liste Eigenschaften unter der Kategorie "Sonstige" angezeigt werden. Dies ist das Standardverhalten, wenn Sie keine bestimmte Kategorie festlegen.

Zuweisen von Eigenschaften zu Kategorien

Durch Hinzufügen eines Attributs zur Eigenschaftendefinition kann es problemlos in eine Kategorie eingefügt oder sogar ganz vor dem Eigenschaftenfenster ausgeblendet werden. Für dieses Steuerelement gibt es zwei Eigenschaften: Valid und RegularExpression. Ich werde RegularExpression in die Kategorie Verhalten einfügen, aber es gibt keine wirkliche Einschränkung, wo Sie eine bestimmte Eigenschaft platzieren; Sie können sogar eine eigene Kategorie erstellen. Das System.ComponentModel.Category-Attribut wird verwendet, um die entsprechende Kategorie anzugeben. Beachten Sie jedoch, dass es nur eine Zeichenfolge als Argument verwendet. Stellen Sie daher sicher, dass Sie den Kategorienamen richtig schreiben:

    <System.ComponentModel.Category("Behavior")> _
     Public Property RegularExpression() As String
        Get
      …

Als Kanadier habe ich ursprünglich die "richtige" Schreibweise für das Verhalten eingefügt und am Ende eine völlig neue Kategorie in meinem Eigenschaftenfenster.

Abbildung 1. Sie können einen beliebigen Kategorienamen verwenden, der als Abschnitt des Eigenschaftenfensters angezeigt wird.

Richtiger Kategoriename oder nicht, Sie können feststellen, dass meiner neuen Eigenschaft eine Beschreibung fehlt (die normalerweise im unteren Bereich des Eigenschaftenfenster angezeigt wird), und, wie Sie vielleicht erraten haben, kann ein anderes Attribut verwendet werden, um dies zu beheben. Das System.ComponentModel.Description-Attribut akzeptiert eine Zeichenfolge als Argument, das dann angezeigt wird, wenn diese Eigenschaft im Eigenschaftenfenster ausgewählt wird:

Private Const regularExpressionDescription As String _
= "The Regular Expression used to validate the contents of this TextBox"

    <System.ComponentModel.Category("Behavior"), _
    System.ComponentModel.Description(regularExpressionDescription)> _
    Public Property RegularExpression() As String
        Get

Valid ist im Gegensatz zu RegularExpression zur Entwurfszeit nicht sehr nützlich (es ist schreibgeschützt und wird basierend auf dem Inhalt des TextBox-Elements berechnet), daher möchte ich, dass es in keiner Kategorie im Eigenschaftenfenster angezeigt wird. Glücklicherweise kann ein anderes Attribut dies für mich übernehmen: das System.ComponentModel.Browsable-Attribut, das ein boolesches Argument akzeptiert, das angibt, ob die Eigenschaft im Eigenschaftenfenster sichtbar sein soll:

<System.ComponentModel.Browsable(False)> _
    Public ReadOnly Property Valid() As Boolean
        Get
            Return IsValid(Text)
        End Get
    End Property

Hinzufügen einer Toolbox-Bitmap

Ein weiteres Problem mit der Darstellung meines neuen Steuerelements besteht darin, dass ich kein Toolboxsymbol angegeben habe, sodass stattdessen das Standardsteuerelementsymbol verwendet wird. Genau wie die Eigenschaftenkategorien wird das Hinzufügen eines Toolboxsymbols durch die Verwendung von Attributen verarbeitet, in diesem Fall das ToolboxBitmap-Attribut . Mit diesem Attribut können Sie einen Pfad zu einer tatsächlichen Bitmapdatei (16 x 16) angeben oder eine Toolbox-Bitmap angeben, die als Ressource in eine Assembly eingebettet ist. In diesem Beispiel werde ich nur einen Dateipfad angeben und eine Toolbox-Bitmap verwenden, die ich in Paint erstellt habe:

<ToolboxBitmap("C:\mytoolboxbitmap.bmp")> _
Public Class regexTextBox
    Inherits System.Windows.Forms.TextBox

Beispiel 1b: Hinzufügen der Validierung regulärer Ausdrücke als alternative Methode

Das Erstellen einer eigenen Version des TextBox-Steuerelements ist eine Möglichkeit, zusätzliche Funktionen hinzuzufügen, aber in .NET können Sie auch ein ähnliches Ergebnis erzielen, indem Sie ein Extenderanbieterobjekt verwenden. Extenderanbieter, z. B. die Komponenten ErrorProvider oder QuickInfo, die bereits in Windows Forms vorhanden sind, ermöglichen ihnen das dynamische Hinzufügen von Eigenschaften zu anderen Steuerelementen. Mithilfe einer solchen Komponente konnte ich allen TextBox-Steuerelementen in meinem Formular eine RegularExpression-Eigenschaft hinzufügen und Validierungsdienste für jedes Steuerelement bereitstellen, das über einen Wert für diese neue Eigenschaft verfügte. In diesem speziellen Fall unterscheidet sich das Endergebnis nicht so vom Erstellen Einer eigenen TextBox-Variante , aber der Extenderanbieteransatz eignet sich gut für jede Art von Funktionalität, die Sie auf eine Gruppe von Steuerelementen gleichzeitig anwenden möchten.

Erstellen eines eigenen Extenderanbieters

Im Gegensatz zu anderen Steuerelementen werden Extenderanbieter durch die Implementierung einer Schnittstelle und nicht durch Vererbung erstellt. Diese Schnittstelle (IExtenderProvider) definiert nur die einzelne Methode CanExtend, aber diese einzelne Methode funktioniert in Kombination mit einer Vielzahl von Attributen auf Klassenebene, um die Funktionalität Ihres Anbieters zu beschreiben. Da Sie Ihren Extenderanbieter in der Windows Forms-Umgebung bearbeiten möchten, sollten Sie ihn zusätzlich zur Implementierung der IExtenderProvider-Schnittstelle von Component oder Control erben:

Public Class regexRevisted
    Inherits System.ComponentModel.Component
    Implements System.ComponentModel.IExtenderProvider

End Class

Hinzufügen von Attributen für jede Eigenschaft

Nachdem Sie Ihre Klasse deklariert haben, müssen Sie ein Attribut für jede Eigenschaft hinzufügen, die Sie anderen Steuerelementen bereitstellen möchten. In diesem Fall möchte ich eine ValidationExpression-Eigenschaft hinzufügen, die die regulären Ausdrücke für jedes TextBox-Steuerelement enthält, und eine Valid-Eigenschaft , die einen True - oder False-Wert zurückgibt, um anzugeben, ob die aktuelle ValidationExpression erfüllt wird. Das Attribut, das ich hinzufügen muss, ist System.ComponentModel.ProvideProperty und benötigt zwei Parameter für den Konstruktor: den Namen der neuen Eigenschaft, die Sie bereitstellen möchten, und den Typ des Steuerelements, dem diese neue Eigenschaft hinzugefügt wird. In meinem Fall habe ich also den folgenden Code hinzugefügt:

<ProvideProperty("ValidationExpression", GetType(TextBox)), _
ProvideProperty("Valid", GetType(TextBox))> _
Public Class regexRevisted

Hinweis Die Dokumentation zu ProvideProperty hatte mich ziemlich verwirrt; Ich war davon überzeugt, dass der zweite Parameter der Typ der Eigenschaft sein sollte, und ich habe versucht, es mithilfe von GetType(String) zum Funktionieren zu bringen. Glücklicherweise hat jemand meinen Fehler ziemlich schnell erkannt, als ich ihn hier bei Microsoft passierte, und ich habe ihn in GetType(TextBox) geändert.

Erstellen von Eigenschaftenroutinen

Für jede Eigenschaft, die Sie mit Ihren Attributen definieren, müssen Sie außerdem Get - und Set-Routinen bereitstellen, damit die Eigenschaft in allen anderen Steuerelementen angezeigt und bearbeitet werden kann. Diese Routinen sind den von Ihnen angegebenen Eigenschaften nur nach Name zugeordnet:

Public Function GetValidationExpression(ByVal o As TextBox) As String

Public Sub SetValidationExpression(ByVal o As TextBox, _
      ByVal ValidationExpression As String)

In diesen Eigenschaftsroutinen müssen Sie die für jedes Steuerelement festgelegten Werte beibehalten, damit Sie nachverfolgen können, welcher Eigenschaftswert auf welches Steuerelement angewendet wird. Um dies in meinem Code zu erreichen, habe ich eine NameValueCollection hinzugefügt, um die ValidationExpression-Eigenschaft für jedes Steuerelement nachzuverfolgen, das sich für das Festlegen eines Werts entscheidet. Mit einer NameValueCollection können Sie eine Auflistung von Zeichenfolgenwerten Zeichenfolgenschlüsselwerten zuordnen, sodass sie einem Dictionary-Objekt sehr ähnlich ist, aber stark typisiert ist, um nur mit Zeichenfolgen zu arbeiten. In diesem Fall habe ich einen einzelnen ValidationExpression-Eintrag dem Namen des entsprechenden Steuerelements zugeordnet. Kontrollnamen müssen auf demselben Formular eindeutig sein, sodass ich sicher sein kann, dass es keine Konflikte gibt:

    Dim RegExpressions As New _
      System.Collections.Specialized.NameValueCollection()

    Public Function GetValidationExpression(ByVal o As TextBox) As String
        Return RegExpressions.Get(o.Name)
    End Function

    Public Sub SetValidationExpression(ByVal o As TextBox, _
            ByVal ValidationExpression As String)
        RegExpressions.Set(o.Name, ValidationExpression)
    End Sub

Zusätzlich zum Festlegen und Abrufen des Werts des regulären Ausdrucks füge ich jedem Steuerelement einen Ereignishandler hinzu, das einen nicht leeren Wert festgelegt hat (was angibt, dass das Steuerelement eine Überprüfung wünscht). Dieser Ereignishandler ist so eingerichtet, dass er das OnValidation-Ereignis jedes TextBox-Objekts abfangen kann, sodass mein ExtenderProvider den Inhalt des Textfelds genau wie regExTextBox überprüfen kann (siehe Beispiel 1a). Wenn die Überprüfung fehlschlägt, wird ein Ereignis des ExtenderProvider ausgelöst, sodass ein einzelner Ereignishandler alle Validierungsfehler der zugeordneten Steuerelemente abfangen kann:

    Public Sub SetValidationExpression(ByVal o As TextBox, _
            ByVal ValidationExpression As String)
        RegExpressions.Set(o.Name, ValidationExpression)
        If ValidationExpression <> "" Then
            AddHandler o.Validating, _
     New System.ComponentModel.CancelEventHandler(AddressOf OnValidating)
        Else
            RemoveHandler o.Validating, _
     New System.ComponentModel.CancelEventHandler(AddressOf OnValidating)
        End If
    End Sub

    Private Sub OnValidating(ByVal sender As Object, _
            ByVal e As System.ComponentModel.CancelEventArgs)
        Dim tb As TextBox
        If TypeOf sender Is TextBox Then
            tb = CType(sender, TextBox)
            Dim validationExpression As String
            validationExpression = RegExpressions.Get(tb.Name)
            If validationExpression <> "" Then
                If Not IsValid(validationExpression, tb.Text) Then
                    RaiseEvent ValidationError(tb, _
                     New System.EventArgs())
                End If
            End If
        End If
    End Sub

Beachten Sie, dass ich den Handler entferne, wenn ValidationExpression auf eine leere Zeichenfolge festgelegt ist. warum Ereignisse behandeln oder anderweitig mit einem Steuerelement arbeiten, das nichts mit meinem Anbieter zu tun haben möchte? Jetzt ist die Valid-Eigenschaft etwas einfacher zu implementieren, da sie eine schreibgeschützte Eigenschaft ist und nur eine GetValid-Funktion erstellt werden muss. Diese Funktion (ruft tatsächlich eine andere Funktion auf, IsValid) überprüft den Inhalt eines bestimmten TextBox-Steuerelements anhand seiner ValidationExpression und gibt True oder False zurück, je nachdem, ob der Inhalt mit dem Ausdruck übereinstimmt:

    Private Function IsValid(ByVal validationExpression As String, _
            ByVal input As String) As Boolean
        Dim reCheck As New Regex(validationExpression)
        Dim myMatch As Match
        myMatch = reCheck.Match(input)
        If Not (myMatch.Success AndAlso _
              myMatch.Index = 0 AndAlso _
              myMatch.Length = input.Length) Then
            Return False
        Else
            Return True
        End If
    End Function

    Public Function GetValid(ByVal o As TextBox) As Boolean
        Dim validationExpression As String
        validationExpression = RegExpressions.Get(o.Name)
        If validationExpression <> "" Then
            Return IsValid(validationExpression, o.Text)
        Else
            Return True
        End If
    End Function

Implementieren der CanExtend-Funktion

Obwohl es logisch erscheint, diese Funktion zuerst zu erstellen, da die IExtenderProvider-Schnittstelle erfordert, dass sie vorhanden ist und sich beschwert, bis Sie sie hinzufügen, war das Hinzufügen meiner Implementierung von CanExtend das letzte Stück Code, den ich geschrieben habe. Die wichtigste Aufgabe von CanExtend besteht darin, für jedes übergebene Steuerelement True oder False zurückzugeben, um anzugeben, ob meine beiden neuen Eigenschaften auf dieses bestimmte Steuerelement angewendet werden sollen. Im Fall meines ExtenderProviders möchte ich, dass diese Eigenschaften auf jedes einzelne TextBox-Element angewendet werden. Daher überprüfen Sie einfach den Typ des angegebenen Steuerelements und geben True zurück, wenn es textBox ist, oder false, wenn dies nicht der Fall ist. Sobald ich mich entschieden habe, ein Steuerelement zu behandeln, füge ich auch einen leeren Eintrag in meine NameValueCollection als Platzhalter für eine mögliche ValidationExpression hinzu:

    Public Function CanExtend(ByVal extendee As Object) As Boolean _
     Implements System.ComponentModel.IExtenderProvider.CanExtend
        If TypeOf extendee Is System.Windows.Forms.TextBox Then
            RegExpressions.Set(CType(extendee, TextBox).Name, "")
            Return True
        Else
            Return False
        End If
    End Function

Letzte Schliffe

Wie beim vorherigen Steuerelement gibt es immer einige zusätzliche Attribute, die festgelegt werden können, oder zusätzlichen Code, der hinzugefügt werden könnte, um das Steuerelement nützlicher oder professioneller im Erscheinungsbild zu machen. Im Fall meines ExtenderProviders möchte ich nicht, dass Programmierer versehentlich die Routinen Get und Set für meine beiden neuen Eigenschaften aufrufen, sodass ich sie mithilfe von EditorBrowsableAttribute in Microsoft Intellisense® ausblenden kann:

    <EditorBrowsableAttribute(EditorBrowsableState.Never)> _
    Public Function GetValid(ByVal o As TextBox) As Boolean

Wenn Sie weitere Informationen zu ExtenderProvider benötigen, können Sie eine exemplarische Vorgehensweise zu diesem Prozess in der .NET Framework-Dokumentation anzeigen, und der Code für dieses Beispiel wird als Teil des Downloads für diesen Artikel bereitgestellt. Der fertige ExtenderProvider namens regexRevisited, wenn er auf einem Windows Form platziert wird, fügt jedem TextBox-Objekt zwei Eigenschaften hinzu: ValidationExpression und Valid. Das Endergebnis und die Programmierererfahrung sind sehr ähnlich wie das Ersetzen jedes TextBox durch den benutzerdefinierten regulären Ausdruck TextBox, den ich zuvor erstellt habe, aber der gesamte Code ist in der einzelnen Komponente enthalten.

Zusammenfassung

Beide Versionen dieses Beispiels bieten das gleiche Ergebnis – die Überprüfung eines TextBox-Steuerelements mit regulären Ausdrücken – aber auf unterschiedliche Weise. Es ist schwierig, eine Methode gegenüber der anderen zu empfehlen, da beide funktionieren und der Code nicht so unterschiedlich ist, aber Sie sollten sich über beide mögliche Möglichkeiten zum Hinzufügen von Features zu Windows Forms Steuerelementen bewusst sein, damit Sie die am besten geeignete Lösung für Ihr bestimmtes Projekt auswählen können.