2014-11-05 7 views
6

मुझे यह भी पता नहीं है कि इस त्रुटि को ठीक करने के लिए कहां देखना है। हाल ही में मैं अपवाद निम्नलिखित पाने के बाद मैं एक DataGridViewCheckBoxColumn में चेकबॉक्स यह जाँच करें और है कि सेल छोड़ने के लिए क्लिक किया है:डेटाग्रिड व्यू चेकबॉक्स कॉलम: बूलियन-कॉलम पर प्रारूप अपवाद

System.FormatException: ""

बूलियन

लिए मान्य नहीं है यहाँ पूरा हो DataGridView से त्रुटि संवाद:

enter image description here

मैं भी नहीं जानता कि जो घटना मैं के लिए कारण खोजने के लिए संभाल सकता इस मुद्दे। त्रुटि से पहले Validating और CellFormatting ईवेंट ट्रिगर किए गए हैं, लेकिन दोनों चलते हैं। यदि मैं DataError संभालता हूं- मैं अभी भी इसे समझ नहीं सकता हूं।

e.ColumnIndex = 0 
e.RowIndex = 0 
e.Context  = Commit 

पूर्ण अपवाद (e.Exception.ToString()) है:

System.FormatException: बूलियन लिए एक मान्य मान नहीं है DataGridViewDataErrorEventArgs तर्क (दूसरों के बीच) निम्नलिखित जानकारियां शामिल हैं। ---> सिस्टम। फोर्मेट अपवाद: स्ट्रिंग को वैध बूलियन के रूप में पहचाना नहीं गया था। System.ComponentModel.BooleanConverter.ConvertFrom पर System.Boolean.Parse (स्ट्रिंग मान) (ITypeDescriptorContext संदर्भ, CultureInfo संस्कृति, वस्तु मूल्य) --- भीतरी अपवाद स्टैक ट्रेस की समाप्ति --- System.ComponentModel पर पर । BooleanConverter.ConvertFrom System.Windows.Forms.DataGridView.DataGridViewDataConnection.PushValue (Int32 boundColumnIndex पर System.ComponentModel.TypeConverter.ConvertFrom (वस्तु मूल्य) पर (ITypeDescriptorContext संदर्भ, CultureInfo संस्कृति, वस्तु मूल्य), Int32 columnIndex, Int32 rowIndex , ऑब्जेक्ट वैल्यू)

enter image description here

BindingSource के डेटा स्रोत एक List<ErpService.ArrivalChargeAssignment> जहां ArrivalChargeAssignment मेरी WCF वेब सेवा से एक वर्ग है:यहाँ प्रासंगिक स्तंभ गुणों का एक स्क्रीनशॉट है, स्तंभ ThreeState=false और FalseValue के लिए निर्दिष्ट किया कुछ भी नहीं, TrueValue या IndeterminateValue है bool -field IsAssigned के साथ, इसलिए यह null (या यहां तक ​​कि एक खाली स्ट्रिंग) कभी भी नहीं हो सकता है।

+0

मुझे याद है कि इस तरह की एक त्रुटि प्राप्त हो रही है (हालांकि काफी वही संदेश नहीं है) जब हमारी टीम विरासत परियोजना पर काम कर रही थी। यह पता चला कि कुछ प्रकार की दौड़ की स्थिति चल रही थी-डेटा स्रोत को कई अलग-अलग धागे में बदल दिया/पढ़ा जा रहा था और नियंत्रण इसे पसंद नहीं आया था। हमने इस पर बहुत समय बिताया लेकिन यह पता नहीं लगा कि इसका क्या कारण था (ताले या तो मदद नहीं करते थे)। हमने अंततः WinForms को हटा दिया और WPF पर चले गए।संभवतः वह उत्तर नहीं जिसे आप ढूंढ रहे थे, लेकिन यदि यह एक नई नई परियोजना है तो इसे WPF में लिखने के लायक होगा। – PoweredByOrange

+3

जब भी डीजीवी निर्दिष्ट डेटाटाइप प्रारूप में मान को प्रारूपित करने का प्रयास करता है तो मुझे भी यही त्रुटि मिल रही थी। मैं इस मुद्दे को हल नहीं कर सका। इसलिए, मैंने इस अपवाद से बचने के लिए 'DataError' ईवेंट को संभाला है। – Shell

+0

@ नीमेश: हां, शायद मैं इस अपवाद को भी निगलूंगा हालांकि अगर मैं कारण नहीं जानता तो मैं अपवादों को अनदेखा नहीं करना चाहता हूं। –

उत्तर

7

ठीक है का उपयोग किया जा सकता है, मैं के साथ खिड़कियां प्रपत्र डिजाइनर कुछ परीक्षण किया है और मैं कुछ कोड जनरेटर में अजीब पाया। तो, मैंने अपने परीक्षण में क्या किया है

सबसे पहले मैंने DataGridViewCheckBoxColumn प्रकार के साथ एक कॉलम जोड़ा है और डेटा तालिका के साथ datagridview पॉप्युलेट किया है। मैंने शून्य मानों के साथ कुछ रिकॉर्ड जोड़ा है।

अब, यह ठीक काम कर रहा था और डेटा सही ढंग से दिखा रहा था और यह भी कोई त्रुटि नहीं दे रहा था। फिर मैंने उस CheckedBoxColumn की संपत्ति को बदल दिया है और मूल्य Nullvalue संपत्ति से हटा दिया है और इसे फिर से शुरू किया है। अब, एप्लिकेशन उस त्रुटि को दिखा रहा है।

मैं उस DefaultCellStyle संपत्ति पर वापस आया और False मूल्य वापस सेट किया। तो मैंने फिर से उस परियोजना को चलाया है। लेकिन, फिर भी यह मुझे एक ही त्रुटि दिखा रहा था।

तो, Form.designer.cs फ़ाइल लोड की गई और dataGridViewCellStyle1 ऑब्जेक्ट की जांच की। जहां मैंने पाया है कि संपत्ति बूलियन प्रकार false के बजाय स्ट्रिंग प्रकार मान "False" के साथ सेट है।

dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter; 
dataGridViewCellStyle1.NullValue = "False"; 
this.Column1.DefaultCellStyle = dataGridViewCellStyle1; 
this.Column1.HeaderText = "Check Box"; 
this.Column1.Name = "chkCol"; 

इसलिए, मैंने निम्नानुसार उस पंक्ति को अद्यतन किया है और परियोजना को फिर से शुरू किया है। अब, त्रुटि चली गई है।

dataGridViewCellStyle1.NullValue = false; 

जब मैं मैंने पाया कि DataGridViewCheckBoxColumn है कि वहाँ कोई वस्तु डिफ़ॉल्ट सेल शैली संपत्ति के लिए बनाई गई है बनाया है। इसलिए, डिफ़ॉल्ट रूप से NullValue संपत्ति false मान ले रही थी। लेकिन, उस प्रॉपर्टी को संशोधित करने के बाद ऑब्जेक्ट बनाया गया है और गुण स्ट्रिंग प्रकार मान के साथ असाइन किया गया है।

अद्यतन: इस समस्या को बस उस कॉलम को फिर से बनाकर हल किया जा सकता है।

+1

बहुत बहुत धन्यवाद। अजीब बात है कि मैंने कॉलम को फिर से बनाने की कोशिश नहीं की है जो एमएस उत्पादों (रीबूट) के साथ पहली कार्रवाई होनी चाहिए;) फिर से धन्यवाद। –

+0

अच्छा जवाब, सटीक रूप से लिखा – Mohit

+1

आपका स्वागत है @ टिमस्चल्टर, हमेशा मदद करने में खुश है और मैंने आज कुछ नया भी सीखा है। – Shell

0

उपयोग इस पूर्ण

private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
     { 
      DataGridView1["Your Column Index", e.RowIndex].Value = Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value); 
     } 

private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
     { 
      if (Convert.ToBoolean(DataGridView1["Your Column Index", e.RowIndex].Value)) 
      { 
       DataGridView1["Your Column Index", e.RowIndex].Value = false; 
      } 
      else 
      { 
       DataGridView1["Your Column Index", e.RowIndex].Value = true ; 
      } 
     } 
0

आप एक काम भी कर सकते हैं। अपनी ग्रिड बनाते समय, आप बुलियन "सत्य" या झूठा असाइन कर सकते हैं (जैसा कि नीचे दिखाया गया है)। उपर्युक्त प्रश्न में, कॉलम इंडेक्स 0 है और जब आप ग्रिड बनाते हैं तो पंक्तिइंडेक्स का उपयोग किया जा सकता है। आपको त्रुटि नहीं मिलेगी। मुझे एक ही समस्या का सामना करना पड़ा और इसे नीचे दिखाए गए अनुसार हल किया गया। अन्य 2 उत्तरों की भी सराहना करें।

DataGridViewCell oCell; 
oCell = dataGridView["Your Column Index", "Your Row index"]; 
oCell.Value = false; 
0

मैं सिर्फ यह एक सुरुचिपूर्ण ढंग से करता है, तो अपने डेटाबेस स्तंभ प्रकार बूलियन ("बिट") और अपने DataGridView AutoGenerateColumns, सच है तो एक DataGridViewCheckBoxColumn उत्पन्न हो जाएगा है, हल हो गई है, इसलिए सभी आपको डिफ़ॉल्ट सत्य और झूठे मानों और डेटा प्रकार को बदलने की आवश्यकता है।

को जेनेरिक कोड मुद्दा हल, डेटा स्रोत assingment के बाद सम्मिलित करें: किसी भी कोड लिखने के बिना

foreach (DataGridViewColumn dc in DataGridView1.Columns) 
{ 
    if (dc.ValueType == typeof(Boolean)) 
    { 
     dc.ValueType = typeof(Int32); 
     ((DataGridViewCheckBoxColumn)dc).DefaultCellStyle.NullValue = 0; 
     ((DataGridViewCheckBoxColumn)dc).TrueValue = 1; 
     ((DataGridViewCheckBoxColumn)dc).FalseValue = 0; 
    } 
} 
0

मैं एक ही समस्या के साथ संघर्ष किया है और उन्हें आसानी से ठीक किया है।

समस्या "TrueValue" या "FalseValue" पैरामीटर के साथ नहीं है, और आपको त्रुटि हैंडलर को फंसाने की आवश्यकता नहीं है। संक्षेप में समस्या तब होती है जब DataGridView ऑब्जेक्ट एक नई पंक्ति जोड़ता है (इसलिए त्रुटि प्रारंभिक पेंट के दौरान आग लगती है), लेकिन समस्या की जड़ यह है कि नई पंक्ति में डेटा अभी तक शुरू नहीं हुआ है, इसलिए यह "अनिश्चित है ".... तो बस इसे खाली करने के बजाय" IndeterminateValue "के लिए एक डिफ़ॉल्ट मान सेट करें।

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