2009-10-28 10 views
8

के लिए बाध्यकारी हमारे पास एक कस्टम नियंत्रण है जिसमें सिस्टम की एक "वैल्यू" प्रॉपर्टी है। Nullable (उर्फ सिस्टम। डेटटाइम?)। हमारे पास एक ही प्रकार की "प्राप्त" संपत्ति वाला ऑब्जेक्ट है। जब हम वस्तु को नियंत्रण बाध्य करने के लिए प्रयास करते हैं, निम्नलिखित InvalidCastException फेंक दिया जाता है:एक नालीबल <DateTime> नियंत्रण संपत्ति

'System.Nullable`1 [[System.DateTime, mscorlib, संस्करण = 2.0 करने के लिए' System.DateTime 'से अमान्य कलाकार .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"); 

जैसा कि आप देख सकते हैं, ऑब्जेक्ट की संपत्ति (this._object.DateTimeReceived) एक सिस्टम है। डेटटाइम? प्रकार और नियंत्रण की संपत्ति (this.dateReceived.Value) एक सिस्टम है। डेटटाइम? प्रकार।

यह अमान्य कैस्टएक्सप्शन क्यों होगा? और हम इसे कैसे ठीक कर सकते हैं ताकि यह सही ढंग से बांध सके?

अद्यतन 2009-10-29 14:26 CDT:

यहाँ स्टैक ट्रेस है:

System.Convert.DefaultToType पर (IConvertible मूल्य, प्रकार TargetType, IFormatProvider प्रदाता) System.DateTime.System.IConvertible.ToType (प्रकार प्रकार, IFormatProvider प्रदाता)
पर
System.Convert.ChangeType पर (वस्तु मूल्य, प्रकार रूपांतरण प्रकार, IFormatProvider प्रदाता) 012,380, System.Windows.Forms.Binding.FormatObject (वस्तु मूल्य)
System.Windows.Forms.Binding.PushData (बूलियन बल)
पर सिस्टम पर System.Windows.Forms.Binding.UpdateIsBinding()
पर पर .Windows.Forms.Binding.CheckBinding()
System.Windows.Forms.Binding.SetListManager (bindingManagerBase bindingManagerBase)
System.Windows.Forms.ListManagerBindingsCollection.AddCore पर पर ( databinding बाइंडिंग)
System.Windows पर .Forms.BindingsCollection.Add (बाध्यकारी बाध्यकारी)
System.Wi पर ndows.Forms.BindingContext.UpdateBinding System.Windows.Forms.Binding.SetBindableComponent (IBindableComponent मूल्य)
System.Windows.Forms.ControlBindingsCollection.AddCore पर पर (BindingContext newBindingContext, बाइंडिंग बंधन)
(बाइंडिंग databinding)
सिस्टम.Windows.Forms.BindingsCollection.Add (बाध्यकारी बाध्यकारी)
सिस्टम.Windows.Forms.ControlBindingsCollection पर।जोड़ें System.Windows.Forms.ControlBindingsCollection.Add (स्ट्रिंग प्रॉपर्टी, वस्तु डेटा स्रोत, स्ट्रिंग पर
(स्ट्रिंग प्रॉपर्टी, वस्तु डेटा स्रोत, स्ट्रिंग DataMember, बूलियन formattingEnabled, DataSourceUpdateMode updateMode, nullValue, स्ट्रिंग formatString, IFormatProvider formatInfo वस्तु) DataMember)

+0

आपके अपवाद के लिए पूर्ण स्टैक ट्रेस क्या है (कृपया वीएस डीबगिंग सेटिंग्स में "बस मेरा कोड" अक्षम करें, ताकि यह .NET Framework के लिए स्टैक फ्रेम को दिखा सके)? –

उत्तर

13

मैं एक ही बात करने के लिए कोशिश कर रहा था, और मैं कुछ काम कर नमूना कोड जो एक नल के लिए बाध्य खोज करने में कामयाब। यह पता चला है कि यदि आप स्वरूपण को सत्य पर सेट करते हैं, तो यह काम करता है, लेकिन यदि यह गलत है, तो आपको अमान्य कास्ट अपवाद मिलता है।

तो अपने कोड इस तरह दिखता है कि:

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

.नेट फ्रेमवर्क आप मैन्युअल रूप से प्रकार रूपांतरण और स्वरूपण स्वरूप का उपयोग कर प्रदर्शन करते हैं और बाध्यकारी वस्तु की घटनाओं पार्स किया था के पिछले संस्करणों में। अब आप बाध्यकारी ऑब्जेक्ट पर स्वरूपण को सक्षम करके, या तो FormattingEnabled प्रॉपर्टी को सीधे सेट करके या ControlBindingsCollection की ऐड विधि में सत्य से गुजरकर ऐसा कर सकते हैं।

संबंधित मुद्दे