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)
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.
Tags und Links c# data-binding datetime winforms nullable