Eigene Textbox mit internem Validating - wie kombinieren mit Cancel Button, der CausesValidation = False?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Eigene Textbox mit internem Validating - wie kombinieren mit Cancel Button, der CausesValidation = False?

    Hi,

    ich habe mir eine Standard Textbox um einigen Funktionen erweitert, unter anderem auch um eine interne Validierung der Eingaben. Funktioniert auch prima.

    Meine Form hat einen Cancel Button mit CausesValidation = False zum Schließen der Form. In diesem Falle interessiert mich die Gültigkeit der Eingabe in der Textbox nicht. Trotzdem wird das interne MeineTextbox_Validating() Ereignis ausgelöst und man kommt nur mit gültiger Eingabe raus.
    Vermutlich wirkt das CausesValidation = False des Buttons nur innerhalb der Form aber nicht in meine Textbox hinein. Kann man das irgendwie weiterleiten?

    Vielen dank

    John

    John422 schrieb:

    Kann man das irgendwie weiterleiten?
    Mach Dir eine eigene Textbox-Klasse, die von außen gesagt bekommt, ob sie das Validating durchführen soll oder einfach True zurückbringt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Schau Dir das Microsoft-Beispiel an. CausesValidation führt nur dazu, dass die Validierung der TextBox nicht ausgelöst wird, wenn der Button angewählt wird. Er bedeutet nicht, dass die Validierung an sich blockiert wird. Das ist dafür da, damit man z.B. einen Hilfebutton anklicken kann, um weitere Informationen zu bekommen, was falsch ist. Es aktiviert also nur eine Sonderbehandlung für das Control, welches CausesValidation auf False gestellt hat.
    Eine Möglichkeit zum Umsetzen des Vorpost-Vorschlags wäre eine Zusatz-Property (z.B. namens IgnoreValidation), die dann beim Abbruchschließen des Forms auf True umgestellt wird. Im Validating-EventHandler Deiner TextBox prüft Du dann einfach als erstes, ob diese Property auf True gestellt ist und reagierst entsprechend.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Eine Möglichkeit zum Umsetzen des Vorpost-Vorschlags wäre eine
    Zusatz-Property (z.B. namens IgnoreValidation), die dann beim
    Abbruchschließen des Forms auf True umgestellt wird. Im Validating-EventHandler Deiner TextBox prüft Du dann einfach als erstes, ob diese Property auf True gestellt ist und reagierst entsprechend.


    Aber da beißt sich doch die Katze in den eigenen Schwanz.

    Anfangs steht mein IgnoreValidation = False.
    Der User klickt in die Textbox, macht aber keine valide Eingabe sondern möchte Abbrechen.
    Nun klickt er den Cancel Button und da greift ja schon das interne Validating meiner Textbox.
    Wo soll ich IgnoreValidation = True setzen?
    Na wo wohl? ;)
    Im Click-EventHandler des Cancel-Buttons, bei dem CausesValidation auf True gesetzt ist. Denn bei diesem Button reagiert die TextBox-Validierung ja eben genau nicht. Das ist ja Sinn von CausesValidation = False.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Oh, wow, böse Falle.

    Bei mir funktionierte es einfach nicht.

    Also Miniprojekt erstellt, um Euch hier das zu zeigen. Dort funktionierte es aber.

    Der Unterschied: In meinem echten Projekt sitzen die Buttons OK und Cancel immer mit Docked=Fill in einem 1x2 TableLayoutPanel, damit ich die projektweit auf allen Forms immer identisch unten rechts habe. Ich muß nur das TableLayoutPanel positionieren und nicht die Buttons einzeln.

    TableLayoutPanel hat auch ein CausesValidation per default = True.
    Damit aber nur der OK Button Validating auslöst, darf nur der CausesValidation = True haben.
    Sowohl der Cancelbutton als auch das umgebende TableLayoutPanel müssen CausesValidation = False haben.

    Danke, wieder was gelernt.
    ...vielleicht hilfts mal jemandem, weil ich auch vor dem Problem Stand:

    Die Form per X oben rechts schließen, löst auch Validating aus.

    Folgenden Code in die Form:

    VB.NET-Quellcode

    1. '//methods
    2. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    3. Select Case ((m.WParam.ToInt64() And &HFFFF) And &HFFF0)
    4. Case &HF060
    5. '//user wants to close form
    6. MeineTextbox.CausesValidation = False
    7. End Select
    8. MyBase.WndProc(m)
    9. End Sub


    Quelle: vbforums.com/showthread.php?64…uot-close-form-is-clicked
    Ich mach das immer anders. Wenn man verhindern will, dass in bestimmten Fällen keiner die Textbox verlässt, dann will man das ja gar nicht, sondern verhindern, dass etwas Anderes gemacht wird, z.B. eine andere Textbox betreten.
    Zumindest ist das bei mir so und hiermit verhindere ich genau das; und Schließen ist kein Problem:

    VB.NET-Quellcode

    1. Private Sub TextBox1_Validating(sender As Object, e As CancelEventArgs) Handles TextBox1.Validating
    2. If Invalid(Textbox1) AndAlso TextBox2.Focused Then e.Cancel = True
    3. End Sub

    Also anstatt das Schließen zu prüfen, prüfe ich die verbotenen Sachen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()