Durch das Abbrechen des Validierungsereignisses für datengebundene Steuerelemente wird der Versuch, die Datenquelle zu aktualisieren, nicht unterdrückt

8

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.

    
Jules 02.11.2009, 13:28
quelle

1 Antwort

1

Ein Aufruf von CancelEdit scheint den Unterschied zu machen.

%Vor%     
helgeheldre 24.10.2012 12:49
quelle