Ich bekomme nicht das Verhalten, das ich für eine TextBox erwartet, die an eine Integer-Eigenschaft in einem Geschäftsobjekt gebunden ist.
Folgendes habe ich getan:
(1) Setze DataSourceUpdateMode
, für die TextBox auf: OnValidation
.
(2) Setzen Sie im Ereignis Validating
für die TextBox e.Cancel = True
, wenn Integer.TryParse fehlschlägt.
(3) Fügen Sie einen Handler zu Binding.Parse
und Binding.BindingComplete
hinzu und platzieren Sie Haltepunkte in den Handlern.
Führen Sie die Anwendung aus, legen Sie "asdasd" in die TextBox und Tab-out.
Trotz der Einstellung e.Cancel = True
werden die Ereignisse Parse
und BindingComplete
beide ausgelöst.
Gemäß der Dokumentation sollte die Einstellung e.Cancel = True
jede weitere Logik unterdrücken.
Ich habe MSDN durchsucht, um herauszufinden, warum dies passiert, aber ich kann nichts finden. Weiß jemand, wo ich einige Details dazu finden kann?
ETA : Ich habe auch dem Validated-Ereignis ein Handle hinzugefügt. Hier ist die Abfolge der Ereignisse:
Falsche Daten:
(1) Validierung. (Ich setze e.Cancel = True
)
(2) Parse
(3) BindingComplete
Gute Daten:
(1) Validierung
(2) Parse
(3) BindingComplete
(4) Validiert
ETA2 : Ein bisschen mehr Info und ein Workaround.
Das Problem mit diesem Verhalten liegt vor, wenn Sie eine Validierung haben, die nicht im Property-Setter implementiert ist.
Nehmen wir beispielsweise an, dass meine ganzzahlige Eigenschaft eine ungerade Zahl sein muss. Ich überprüfe das nicht im Property Setter, also überprüfe ich das Validierungsereignis.
Wie Sie sehen, wird der Wert als zulässige Ganzzahl aus dem obigen Verhalten in die Datenquelle geschrieben, selbst wenn ich die Validierung abbringe.
Trotz der Tatsache, dass die Datenquelle aktualisiert wird, wird das Validated-Ereignis nicht ausgelöst, wenn Sie im validierenden Ereignis Cancel setzen, sodass Sie den Fortschritt des Benutzers weiterhin verhindern können.
Work-Around ::
Um die Aktualisierung der Datenquelle zu stoppen, müssen Sie im Ereignis Binding.Parse
validieren und eine Ausnahme auslösen, die verhindert, dass die Bindung erfolgreich abgeschlossen werden kann.
Ein Aufruf von CancelEdit scheint den Unterschied zu machen.
%Vor%Tags und Links .net data-binding winforms validation vb.net