2015-06-19 5 views
13

मैं उनकी जांच की गई डेटा मॉडल पर बूलियन गुण के लिए बाध्य गुणों के साथ मेरी फार्म पर स का एक समूह है:WriteValue के साथ एक बुलियन बाध्यकारी अद्यतन करते समय मुझे प्रारूप अपवाद क्यों मिलेगा?

chk1.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty1", false)) 
chk2.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty2", false)) 
chk3.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty3", false)) 

वहाँ भी है कि यह सुनिश्चित करता डेटाबाउंड मूल्य है स्क्रीन पर सभी चेक बॉक्स के लिए एक साझा ईवेंट हैंडलर सही मूल्य पर सही ढंग से सेट करें।

इच्छित प्रकार के लिए मूल्य को स्वरूपित नहीं कर सकता:

private void AllCheckboxes_CheckedChanged(object sender, EventArgs e) 
{ 
    var chk = ((CheckBox)sender); 

    var binding = chk.DataBindings["Checked"]; 
    if (binding != null) 
     binding.WriteValue(); 
} 

कुछ मामलों में, पहली बार के लिए इस प्रपत्र और बाइंडिंग लोड किए गए हैं, मैं एक अपवाद मिलता है।

System.Windows.Forms.Binding.PullData पर System.Windows.Forms.BindToObject.SetValue (वस्तु मूल्य) पर System.ComponentModel.ReflectPropertyDescriptor.SetValue (वस्तु घटक, वस्तु मूल्य) पर

(बूलियन पुनः स्वरूपित, बूलियन बल) System.Windows.Forms.Binding.WriteValue पर()

यह पहली चेकबॉक्स घटना पर कार्रवाई करने के लिए ठीक से काम करता है, लेकिन फिर एक दूसरे के इस अपवाद फेंक देते हैं।

डेटा स्रोत मेरी डेटामॉडल

public interface IMyDataModel 
{ 
    bool MyBooleanProperty1 { get; set; } 
    bool MyBooleanProperty2 { get; set; } 
    bool MyBooleanProperty3 { get; set; } 
} 

की एक अंतरफलक है और मैं पुष्टि कर सकते हैं डेटा मॉडल ही ईवेंट हैंडलर में .WriteValue से पहले एक ब्रेकपाइंट सही सेटिंग के द्वारा ठीक से सेट है। मैं बाध्य बुलियन संपत्ति के सेटटर में ब्रेकपॉइंट भी डाल सकता हूं, और इसे सही ढंग से भी कहा जाता है।

अगर मैं सच के लिए बाध्य की FormattingEnabled गुण सेट है, यह इस मुद्दे को ठीक करता है। लेकिन मुझे आश्चर्य है कि मुझे इसे पहले स्थान पर क्यों करना है, क्योंकि मैं यूआई ऑब्जेक्ट में संपत्ति को डेटा स्रोत पर bool संपत्ति पर बाध्य कर रहा हूं।

मुझे इस मामले में यह अपवाद क्यों मिलेगा?

+0

आप को सक्षम किया 'IsThreeState' संपत्ति के माध्यम से जा सकते हैं? –

+0

नहीं, IsThreeState – Rachel

+0

सेट नहीं है मैं 'IsThreeState' सेट करने का प्रयास करता हूं या अपने बाध्यकारी को शून्य करने वाला बूल बना देता हूं। मैं समझता हूं कि यह एक शून्य बाध्यकारी समस्या की तरह नहीं दिखता है, लेकिन मुझे चेकबॉक्स में शून्य प्रबंधन करने की उम्मीद है। –

उत्तर

1

यह सुनिश्चित करें कि क्या एक तरह से इस मुद्दे को पुन: पेश करने के बिना चल रहा है के लिए कहना मुश्किल है।

लेकिन कम से कम मैं समझा सकता है क्यों की स्थापना FormattingEnabled बनाता अपवाद चले जाओ:

http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Binding.cs,853

WriteData कॉल reformat = true और force = true साथ PullData

अपने कॉल स्टैक से, ऐसा लगता है कि आप इस ब्लॉक में यह कर रही किया जाना चाहिए की तरह:

  // Put the value into the data model 
      if (!parseFailed) { 
       this.bindToObject.SetValue(parsedValue); 
      } 

तुरंत निम्नलिखित है कि, अपवाद जब तकFormattingEnabled = truerethrown है। इसलिए FormattingEnabled सेटिंग को समस्या से छिपाते हैं, क्योंकि ऐसा लगता है कि Binding मानता है कि आप अब तक किसी भी स्वरूपण/पार्सिंग समस्याओं को संभालने जा रहे हैं।

क्यों अपवाद पहली जगह में फेंक दिया जाता है का सवाल है ... मैं नहीं जानता।

http://referencesource.microsoft.com/#system/compmod/system/componentmodel/ReflectPropertyDescriptor.cs,1138

मुझे पता है कि आपकी समस्या बनी रहती है, तो अगर आप अपने BindingValue कस्टम वर्ग के बिना अपने डेटा बाइंडिंग जोड़ने के लिए एक रास्ता खोजने के लिए उत्सुक हो जाएगा: कुछ नहीं स्पष्ट यहाँ देख रहा है। यदि आपके पास BindingValue में कोई श्रोताओं को तारित किया गया है तो भी मुझे उत्सुकता होगी।

+1

कोड के लिए धन्यवाद लिंक, उन मदद। मैंने संपत्ति के प्राप्त/सेट में हमारे आंतरिक परिवर्तन अधिसूचना कोड के कारण कुछ समस्या को कम कर दिया है। नियमित जेनेरिक 'का उपयोग करना; सेट; 'अपवाद का कारण नहीं है। मैं आपको बक्षीस दे रहा हूं क्योंकि एमएसडीएन कोड लिंक सबसे अच्छा स्पष्टीकरण प्रदान करते हैं कि मुझे त्रुटि क्यों मिल रही है और सुझाव है कि यह कहां से हो सकता है, इसलिए मैं उस दिशा में बाद में डीबग करना जारी रखूंगा जब मेरे पास अधिक समय होगा । धन्यवाद। – Rachel

0

मुझे लगता है कि अगर पार्स/प्रारूप को संभाला नहीं जा रहा है तो यह एक अपवाद फेंकता है, यही कारण है कि formattingEnabled काम करता है।

Binding.Format और ईवेंट को संभालने का प्रयास करें ताकि यह सत्यापित किया जा सके कि यह किस प्रकार भेजता है (और अपेक्षाएं) सही हैं।

+0

दोनों घटनाएं 'ई। डिज़ायर्ड टाइप' और 'ई। वैल्यू' को 'सिस्टम' बूलियन 'के रूप में सही ढंग से दिखाती हैं। वे दोनों अपवादों के बिना सही ढंग से हिट होने लगते हैं। – Rachel

0

यही वह है जो मैं करता हूं। मॉडल को INotifyPropertyChanged इंटरफ़ेस लागू करना चाहिए। टूलबॉक्स से अपने फॉर्म में BindingSource जोड़ें। अपने मॉडल में DataSource सेट करें। प्रत्येक चेकबॉक्स पर डेटा बाध्यकारी सेट करें। मैं उन्नत विंडो का उपयोग करता हूं और डेटा स्रोत अद्यतन मोड को OnPropertyChanged पर सेट करता हूं। इस मामले में आपको अपने चेक बॉक्स के लिए कोई ईवेंट हैंडलर सेट करने की आवश्यकता नहीं है। इस प्रकार

this.chk1.DataBindings.Add(new System.Windows.Forms.Binding("EditValue", this.bindingSource1, "MyProperty", true)); 

के रूप में स्वरूपण को सक्षम करने से

+0

एक बेहतर दुनिया में मैं 'INotifyPropertyChanged' का उपयोग करूंगा, हालांकि मेरे पास इस मामले में एप्लिकेशन इंफ्रास्ट्रक्चर पर नियंत्रण नहीं है और बिना किसी परेशानी के इसे बदल सकता है। इसके अलावा, मैं इस बारे में एक उत्तर ढूंढ रहा हूं कि यह क्यों हो रहा है, संभावित सुधारों के लिए नहीं। – Rachel

0
+1

जैसा कि मैंने पहले ही अपने प्रश्न में कहा है, मुझे पता है कि प्रारूपण को सक्षम करने से यह "ठीक हो जाएगा", लेकिन मैं जानना चाहता हूं कि समस्या को पहले स्थान पर क्या कारण है। – Rachel

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

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