سؤال

لدينا التحكم المخصصة له "قيمة" ممتلكات نوع النظام.Nullable (ويعرف أيضا باسم النظام.التاريخ والوقت?).لدينا كائن مع "تلقى" المنشأة من نفس النوع.عندما نحاول ربط عنصر التحكم إلى الكائن التالي InvalidCastException يتم طرح:

صالح الزهر من النظام.DateTime' أن 'النظام.Nullable`1[[النظام.التاريخ والوقت ، mscorlib, Version=2.0.0.0 الثقافة=محايدة الأمر PublicKeyToken=b77a5c561934e089]]'.

هنا هو ما نقوم به:

الكائن الخاصية:

private System.DateTime? _dateTimeReceived;
public System.DateTime? DateTimeReceived
{
    get
    {
        return this._dateTimeReceived;
    }
    set
    {
        this._dateTimeReceived = value;
        this.OnChanged("DateTimeReceived", value); //Implements INotifyPropertyChanged and fires PropertyChanged event
    }
}

التحكم في الملكية:

private System.DateTime? _value;
[System.ComponentModel.Category("Behavior")]
[System.ComponentModel.Description("The current date value for this control")]
public new System.DateTime? Value
{
    get
    {
        return this._value;
    }

    set
    {
        this._value = value;
    }
}

في التطبيق ، هنا حيث يتم طرح استثناء:

this.dateReceived.DataBindings.Add("Value", this._object, "DateTimeReceived");

كما يمكنك أن ترى, الكائن العقار (هذا._object.DateTimeReceived) هو نظام.التاريخ والوقت?نوع عنصر التحكم الملكية (هذا.dateReceived.القيمة) هو نظام.التاريخ والوقت?نوع.

لماذا هذا يسبب InvalidCastException?و كيف يمكننا تصحيح هذا بحيث يربط بشكل صحيح ؟

تحديث 2009-10-29 14:26 CDT:

هنا هو تتبع المكدس:

في النظام.تحويل.DefaultToType(IConvertible القيمة نوع targetType ، IFormatProvider موفر)
في النظام.التاريخ والوقت.النظام.IConvertible.ToType(نوع نوع IFormatProvider مزود)
في النظام.تحويل.ChangeType(كائن ، conversionType, IFormatProvider موفر)
في النظام.يقوم نظام ويندوز.أشكال.ملزمة.FormatObject(كائن قيمة)
في النظام.يقوم نظام ويندوز.أشكال.ملزمة.PushData(منطقية القوة)
في النظام.يقوم نظام ويندوز.أشكال.ملزمة.UpdateIsBinding()
في النظام.يقوم نظام ويندوز.أشكال.ملزمة.CheckBinding()
في النظام.يقوم نظام ويندوز.أشكال.ملزمة.SetListManager(BindingManagerBase bindingManagerBase)
في النظام.يقوم نظام ويندوز.أشكال.ListManagerBindingsCollection.AddCore(ملزمة ربط البيانات)
في النظام.يقوم نظام ويندوز.أشكال.BindingsCollection.إضافة(ملزمة ملزمة)
في النظام.يقوم نظام ويندوز.أشكال.BindingContext.UpdateBinding(BindingContext newBindingContext ملزمة ملزمة)
في النظام.يقوم نظام ويندوز.أشكال.ملزمة.SetBindableComponent(IBindableComponent قيمة)
في النظام.يقوم نظام ويندوز.أشكال.ControlBindingsCollection.AddCore(ملزمة ربط البيانات)
في النظام.يقوم نظام ويندوز.أشكال.BindingsCollection.إضافة(ملزمة ملزمة)
في النظام.يقوم نظام ويندوز.أشكال.ControlBindingsCollection.إضافة(سلسلة propertyName, كائن مصدر البيانات ، سلسلة dataMember, منطقية formattingEnabled, DataSourceUpdateMode أوبداتيمودي ، وجوه nullValue, سلسلة formatString, IFormatProvider formatInfo)
في النظام.يقوم نظام ويندوز.أشكال.ControlBindingsCollection.إضافة(سلسلة propertyName, كائن مصدر البيانات ، سلسلة dataMember)

هل كانت مفيدة؟

المحلول

كنت أحاول أن أفعل نفس الشيء ، و تمكنت من العثور على بعض العمل على نموذج التعليمات البرمجية التي لا بد أن nullable.اتضح أنه إذا قمت بتعيين formattingEnabled إلى true, يعمل, ولكن لو كان كاذبا ، يمكنك الحصول على باطل يلقي استثناء.

حتى التعليمات البرمجية الخاصة بك التي تبدو مثل هذا:

this.dateReceived.DataBindings.Add("Value", this._object, "DateTimeReceived");

بدلا من ذلك يجب أن تبدو مثل هذا:

this.dateReceived.DataBindings.Add("Value", this._object, "DateTimeReceived", true);

على ما يبدو القديم ربط البيانات رمز يتطلب أن أنواع تتطابق تماما, ولكن مايكروسوفت في وقت لاحق أضيفت القدرة على تحويل تلقائيا أنواع بالنسبة لك.من هنا: http://msdn.microsoft.com/en-us/library/aa480734.aspx

في الإصدارات السابقة من .NET Framework كان لديك يدويا أداء نوع التحويلات و التنسيق باستخدام تنسيق وتحليل أحداث ملزمة الكائن.يمكنك الآن القيام بذلك عن طريق تمكين التنسيق على ربط كائن ، إما عن طريق وضع FormattingEnabled الملكية مباشرة أو تمرير صحيح أن طريقة إضافة ControlBindingsCollection.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top