Events einer TextBox programmgesteuert auslösen

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Rainman.

    Events einer TextBox programmgesteuert auslösen

    Ich versuche gerade das Event TextBox.Validated programmgesteuert auszulösen,
    damit folgender Code sowohl beim Verlassen der TextBox als auch anderweitig ausgeführt wird.

    Quellcode

    1. Private Sub TextBox_Validated(sender As Object, e As EventArgs) Handles TextBox.Validated
    2. End Sub

    Es soll also analog zu Button.PerformClick() arbeiten, wo das Auslösen des Click-Events simuliert wird.
    Zu Button.PerformClick() sagt mir die MS Reference Source, dass da einfach
    OnClick(EventArgs.Empty) aufgerufen wird, was ja dann wiederum das gewünschte Event auslöst.

    Leider kann man keine Prozedur wie TextBox.OnValidated aufrufen.
    In der zugrunde liegenden Control-Klasse sind die On... Prozeduren zwar alle deklariert, aber wegen Modus Protected kommt man leider nicht dran.
    Wie geht man vor, wenn man dennoch die On... Prozeduren aufrufen möchte?
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!
    also wirklich auslösen kannst du das Event nicht, das kann nur die Textbox.

    Aber den Code, der normalerweise durch das Event aufgerufen wird, den kannste schon auch anderweitig aufrufen.

    sauber gecodet wäre, wenn der Validated-Handler nix täte, als eine weitere Methode aufzurufen.
    Und diese weitere kannst du ja auch aufrufen.

    quick & dirty wäre den Validated-Handler direkt aufzurufen:

    VB.NET-Quellcode

    1. Call TextBox_Validated(Nothing, Nothing)

    Das Auslösen des Events TextBox.Validated hat den Vorteil,
    dass dann auch alle Event-Handler bedient werden, die sich schon vorher
    mittels AddHandler an das Event TextBox.Validated gebunden hatten.

    Deswegen hilft es auch nicht, ein eigenes Event myEvent zu deklarieren,
    dieses mit AddHandler zusätzlich an TextBox_Validated zu kleben und bei Bedarf
    mit RaiseEvent myEvent(Me, System.EventArgs.Empty) auszulösen.
    Das war bis gerade noch mein Favorit ...
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!
    wie gesagt: In OOP ists das exclusiv-hoheitliche Recht einer Klasse, ihre eigenen Events auszulösen.
    Also nur die Textbox kann ihr Event auslösen, von aussen geht das nicht.

    evtl. kannst du indirekt vorgehen, indem du den Container, auf dem die Textbox aufsitzst validierst:

    VB.NET-Quellcode

    1. dim result as Boolean=containerControl.Validate()
    Das löst glaub die Validated-Events aller auf diesem Container aufsitzenden Controls aus.
    Glaub ich zumindest, müssteste testen.
    In OOP ists das exclusiv-hoheitliche Recht einer Klasse, ihre eigenen Events auszulösen.
    Also nur die Textbox kann ihr Event auslösen, von aussen geht das nicht.

    Das brachte mich auf die Idee mit einer abgeleiteten TextBox:

    VB.NET-Quellcode

    1. Public Class MyTextBox
    2. Inherits TextBox
    3. Protected Overrides Sub OnValidated(e As EventArgs)
    4. MyBase.OnValidated(e)
    5. End Sub
    6. Sub Validate()
    7. OnValidated(System.EventArgs.Empty)
    8. End Sub
    9. End Class

    Man kann nun einfach TextBox1.Validate() aufrufen und das Event wird ausgelöst.
    Nachteil: man muss alle vorhandenen TextBox Controls auf die eigene Klasse umstellen.
    An manchen Tagen gibt es zu allem Überfluss auch noch Ärger!