2010-12-01 15 views
27

जिसे इस चिंता का विषय हो सकता है, मैं समय की एक पर्याप्त राशि खोज की है, इस त्रुटि से बाहर एक तरह से काम करने के लिए करने के लिएत्रुटि: हटाई गई पंक्ति जानकारी पंक्ति

"Deleted row information cannot be accessed through the row"

मुझे समझ के माध्यम से पहुँचा नहीं जा सकता है कि एक पंक्ति में एक बार एक डेटाटेबल से हटा दिया गया है जिसे इसे सामान्य रूप से एक्सेस नहीं किया जा सकता है और इसलिए मुझे यह त्रुटि मिल रही है। बड़ा मुद्दा यह है कि मुझे यकीन नहीं है कि मेरा वांछित परिणाम प्राप्त करने के लिए क्या करना है, जिसे मैं नीचे उल्लिखित करूँगा।

मूल रूप से जब "DG1" में एक पंक्ति पंक्ति हटा दी जाती है के नीचे इसे नष्ट कर दिया पंक्तियों सूचकांक विरासत में नष्ट कर दिया पंक्ति (जाहिर है) की जगह लेता है और इस तरह। इस विधि का उद्देश्य पंक्तियों सूचकांक को प्रतिस्थापित करना और रीसेट करना है (इसे डेटासेट में इसी मान से पकड़कर) जो हटाए गए पंक्तियों को स्थानांतरित करता है और जैसे सूचकांक मान।

अभी मैं सिर्फ एक लेबल (lblText) का उपयोग कर रहा कोशिश करते हैं और इस प्रक्रिया से एक प्रतिक्रिया प्राप्त करने के लिए, लेकिन यह दुर्घटनाओं जब पिछले नेस्टेड बयान मानों की तुलना करने trys है।

void dg1_Click(object sender, EventArgs e) 
    { 
     rowIndex = dg1.CurrentRow.Index; //gets the current rows 
     string value = Convert.ToString(dg1.Rows[rowIndex].Cells[0].Value); 

     if (ds.Tables[0].Rows[rowIndex].RowState.ToString() == "Deleted") 
     { 

      for (int i = 0; i < dg1.Rows.Count; i++) 
      { 

       if (Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
       //^**where the error is occurring** 
       { 
        lblTest.Text = "Aha!"; 
        //when working, will place index of compared dataset value into         rowState, which is displaying the current index of the row I am focussed on in 'dg1' 
       } 
      } 
     } 

धन्यवाद आगे मदद के लिए समय की, मैं वास्तव में खोज की है, और अगर यह एक सरल गूगल खोज के माध्यम से यह पता लगाने के लिए आसान है तो अनुमति देने के अपने आप को repeatably मुझ पर नफरत करने के लिए:

यहाँ कोड है , क्योंकि मैंने कोशिश की थी।

  • जीसी

उत्तर

31

भीतरी में डेटा स्तंभ अगर बयान नष्ट कर दिया पंक्तियों के लिए उपलब्ध नहीं होगा के लिए वर्तमान मूल्य। हटाए गए पंक्तियों के लिए मान पुनर्प्राप्त करने के लिए, निर्दिष्ट करें कि आप मूल मान चाहते हैं। यदि पंक्ति यह मान है ऐक्सेस करने से पहले हटा दिया गया है आप देख सकते हैं,

if (Convert.ToString(ds.Tables[0].Rows[i][0, DataRowVersion.Original].ToString()) == value) 
+0

जब आप पहले से ही '.ToString()' का उपयोग कर चुके हैं तो आप 'Convert.ToString' का उपयोग क्यों करते हैं? यह अनावश्यक लगता है। –

+0

@druciferre - मैं मानता हूं कि यह अनावश्यक है। मैंने ओपी के मूल कोड की प्रतिलिपि बनाई और डेटारो के मूल मूल्य का उपयोग करने के लिए इसे संशोधित किया। – firedfly

0

पंक्ति को हटाने के बाद, datatable के साथ अपने ग्रिड rebind, कोई जरूरत मैन्युअल रूप से सूचकांक को रीसेट करने के लिए, datatable HANDELS यह।

ताकि आप onl; पि ग्रिड के डेटा स्रोत rebind करने की जरूरत है।

+0

मैं माफी चाहता मैं स्पष्ट किया जाना चाहिए था हूँ, मैं सब पर डेटा स्रोत को अद्यतन करने का प्रयास नहीं कर रहा हूँ, मैं इसे बनाने के लिए इतना है कि कोई फर्क नहीं पड़ता datagrid में पंक्तियों के स्थान, datagrid हमेशा दिखाई देगा कोशिश कर रहा हूँ उस जानकारी की अनुक्रमणिका डेटासेट में है। यानी - डेटाग्रिड की पंक्ति 2 1 की अनुक्रमणिका देता है लेकिन डेटासेट में, उस पंक्ति का सूचकांक 2. डेटाबेस को हटाने के बिना, मुझे डेटासेट से उस पंक्ति की अनुक्रमणिका को पकड़ने और उसे स्थानांतरित करने की आवश्यकता है डेटाग्रिड इसलिए डीजी में एक ही पंक्ति (एक ही जानकारी के साथ पंक्ति) 2. सूचकांक दिखाती है 2. – zillaofthegods

+0

शायद मैं आपकी व्याख्या से उलझन में हूं, मैं अभी भी सी # डेटाबेस पहुंच के तर्क के लिए उपयोग कर रहा हूं। – zillaofthegods

12

अपने "अगर दुर्घटनाग्रस्त" में:: यह आपके त्रुटि को ठीक करना चाहिए

if (ds.Tables[0].Rows[i].RowState != DataRowState.Deleted && 
    Convert.ToString(ds.Tables[0].Rows[i][0].ToString()) == value) 
{ 
    // blaaaaa 
} 

इसके अलावा, मुझे यकीन है कि तुम क्यों toString नहीं कर रहा हूँ() RowState को DataRowState से तुलना करने की बजाय। हटाया गया।

36

तुम भी डेटासेट के AcceptChanges() विधि का उपयोग पूरी तरह से हटाए गए लागू करने के लिए कर सकते हैं।

ds.Tables[0].Rows[0].Delete(); 
ds.AcceptChanges();