Bindung an eine NullableDateTime-Steuerelementeigenschaft

8

Wir haben ein benutzerdefiniertes Steuerelement mit einer Eigenschaft "Value" vom Typ System.Nullable (alias System.DateTime?). Wir haben ein Objekt mit einer "Received" -Eigenschaft desselben Typs. Wenn wir versuchen, das Steuerelement an das Objekt zu binden, wird folgende InvalidCastException ausgelöst:

Ungültige Umwandlung von 'System.DateTime' in 'System.Nullable'1 [[System.DateTime, mscorlib, Version = 2.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]'.

Hier ist was wir tun:

Objekteigenschaft:

%Vor%

Steuereigenschaft:

%Vor%

In der Anwendung wird hier die Ausnahme ausgelöst:

%Vor%

Wie Sie sehen, ist die Eigenschaft des Objekts (this._object.DateTimeReceived) eine System.DateTime? Typ und die Eigenschaft des Steuerelements (this.dateReceived.Value) ist eine System.DateTime? Geben Sie ein.

Warum würde dies eine InvalidCastException verursachen? Und wie können wir das korrigieren, damit es richtig bindet?

Update 2009-10-29 14:26 CDT:

Hier ist der Stack-Trace:

  

bei System.Convert.DefaultToType (IConvertible-Wert, Type targetType,   IFormatProvider-Anbieter)
bei   System.DateTime.System.IConvertible.ToType (Typ, IFormatProvider   Anbieter) bei System.Convert.ChangeType (Objektwert, Typ   conversionType, IFormatProvider-Provider)
um   System.Windows.Forms.Binding.FormatObject (Objektwert)
at   System.Windows.Forms.Binding.PushData (Boolesche Kraft)
bei   System.Windows.Forms.Binding.UpdateIsBinding ()
bei   System.Windows.Forms.Binding.CheckBinding ()
bei   System.Windows.Forms.Binding.SetListManager (BindingManagerBase   bindingManagerBase)
bei   System.Windows.Forms.ListManagerBindingsCollection.AddCore (Bindung   dataBinding)
bei   System.Windows.Forms.BindingsCollection.Add (Bindungsbindung)
at   System.Windows.Forms.BindingContext.UpdateBinding (BindingContext   newBindingContext, Bindungsbindung)
bei   System.Windows.Forms.Binding.SetBindableComponent (IBindableComponent   Wert)
bei   System.Windows.Forms.ControlBindingsCollection.AddCore (Bindung   dataBinding)
bei   System.Windows.Forms.BindingsCollection.Add (Bindungsbindung)
at   System.Windows.Forms.ControlBindingsCollection.Add (Zeichenfolge   propertyName, Objekt dataSource, String dataMember, Boolean   FormatierungEnabled, DataSourceUpdateMode updateMode, Object nullValue,   String formatString, IFormatProvider formatInfo)
  System.Windows.Forms.ControlBindingsCollection.Add (Zeichenfolge   propertyName, Objekt dataSource, String dataMember)

    
Steven King 28.10.2009, 21:42
quelle

1 Antwort

13

Ich habe versucht, das Gleiche zu tun, und ich habe es geschafft, einen funktionierenden Beispielcode zu finden, der an eine Nullable gebunden ist. Es stellt sich heraus, dass, wenn Sie die FormatierungEnabled auf true setzen, es funktioniert, aber wenn es falsch ist, erhalten Sie die ungültige Cast-Ausnahme.

Also Ihr Code, der so aussieht:

%Vor%

Sollte stattdessen so aussehen:

%Vor%

Offenbar erfordert der alte Datenbindungscode, dass die Typen genau übereinstimmen, aber Microsoft hat später die Möglichkeit hinzugefügt, automatisch Typen für Sie zu konvertieren. Von hier aus: Ссылка

  

In früheren Versionen von .NET Framework mussten Sie die Typkonvertierungen und -formatierungen mithilfe der Ereignisse Format und Parse des Binding-Objekts manuell durchführen. Sie können dies jetzt tun, indem Sie die Formatierung für das Binding-Objekt aktivieren, indem Sie entweder die FormatEnabled-Eigenschaft direkt festlegen oder die Add-Methode der ControlBindingsCollection auf true anwenden.

    
Bryce Wagner 09.11.2009, 14:41
quelle