2011-09-13 11 views
6

निष्पादित नहीं कर सकता है मेरे पास एक स्तर के माता-पिता और बच्चे नोड्स के साथ वृक्षदृश्य नियंत्रण है, प्रत्येक नोड में चयन के बाद नोड्स का चयन करने के लिए एक चेकबॉक्स है यदि मैं हटाएं बटन क्लिक करता हूं, तो मैं बच्चे या माता-पिता को जो भी चुना जाता है उसे हटा देना चाहता हूं, Im कोड के बाद और यह एक त्रुटि देता हैचयनित पैरेंट नोड और बाल नोड्स हटाएं - संग्रह संशोधित किया गया था; गणना ऑपरेशन

कोड

protected void btnRemoveOrganisation_Click(object sender, EventArgs e) 
    { 

     foreach (TreeNode Item in tvwSelectedOrganisations.CheckedNodes) 
     { 

      if (Item.Parent == null) 
      { 
       foreach (TreeNode ChildNode in Item.ChildNodes) 
       { 
        Item.ChildNodes.Remove(ChildNode); 
       } 

       tvwSelectedOrganisations.Nodes.Remove(Item); 
      } 
      else 
      { 
       Item.Parent.ChildNodes.Remove(Item); 
      } 

     } 

    } 

त्रुटि

संग्रह संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता है।

संशोधित कोड

 protected void btnRemoveOrganisation_Click(object sender, EventArgs e) 
     { 
      TreeNodeCollection SelectedNodes = tvwSelectedOrganisations.CheckedNodes; 

      foreach (TreeNode Item in SelectedNodes) 
      { 

       if (Item.Parent == null) 
       { 
        tvwSelectedOrganisations.Nodes.Remove(Item); 
       } 
       else 
       { 
        tvwSelectedOrganisations.FindNode(Item.Parent.ValuePath).ChildNodes.Remove(Item); 

       } 

       if (SelectedNodes.Count == 0) 
       { 
        break; 
       } 

      } 

     } 

समाधान

int SelectedCount = SelectedNodes.Count; 

      for (int i = SelectedCount - 1; i >= 0; i--) 
      { 

       if (tvwSelectedOrganisations.CheckedNodes[i].Parent == null) 
       { 
        int j = tvwSelectedOrganisations.CheckedNodes[i].ChildNodes.Count; 
        tvwSelectedOrganisations.Nodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); 
        i += j; 
       } 
       else 
       { 
        tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ShowCheckBox = false; 
        tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ChildNodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); 

       } 

      } 
+0

समाधान मिला, समस्या सामान्य जेनेरिक सूची के कारण थी, मैंने सही कोड – sudheshna

उत्तर

4

आशा है कि आप नेट 3.5 या उच्चतर का उपयोग कर रहे हैं।

foreach (TreeNode ChildNode in Item.ChildNodes.ToList()) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 

संपादित

तो Item.ChildNodes Enumerable नहीं है। तब नीचे आज़माएं।

for(int i = Item.ChildNodes.Count - 1; i >= 0; i--) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 

या

while (Item.ChildNodes.Count > 0) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 
+0

आईएम फेंकता है, लेकिन जब मैंने फ़ोरैच लूप बदल दिया, तो यह एक बिल्ड त्रुटि प्रदर्शित करता है, "त्रुटि 'System.Web.UI.WebControls.TreeNodeCollection' में 'ToList' की परिभाषा नहीं है और 'SystemLeb.UI.WebControls.TreeNodeCollection' प्रकार के पहले तर्क को स्वीकार करने के लिए कोई विस्तार विधि 'ToList' नहीं मिल सकती है। (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?) " – sudheshna

+0

बस और विकल्प जोड़े गए। – CharithJ

+0

हाय चरथ, मैंने लूप की कोशिश की है और यह काम किया है, सही समाधान के साथ पोस्ट को अपडेट किया है।धन्यवाद – sudheshna

2

आप foreach के अंदर इस लाइन नहीं हो सकता, क्योंकि आप संग्रह आप पर गणना कर रहे हैं संशोधित कर रहे हैं:

tvwSelectedOrganisations.Nodes.Remove(Item); 

इसके बजाय, निकालने के लिए आइटम्स की एक नई सूची बनाएं, फिर उस सूची के माध्यम से पुन: प्रयास करें और अपने मौजूदा foreach के बाहर की वस्तुओं को हटा दें।

+0

स्पाइकएक्स और कल्याण के साथ पोस्ट को अपडेट किया है, मैंने यह कोशिश की है। मैं अपने नए संग्रह से उसी आइटम को हटाने का कारण नहीं हूं, मैं भी मेरा नया कोड शामिल करने के लिए मेरी पोस्ट को संशोधित किया है। इसके अलावा यदि मैं एक नोड में एकल नोड या आइटम को हटाने का प्रयास करता हूं तो यह काम करता है, लेकिन यदि एकाधिक नोड्स में आइटम का चयन किया जाता है तो यह फ्रेमवर्क 4 का उपयोग करके एक ही अपवाद – sudheshna

1

निश्चित रूप से, यह अपवाद फेंक देते हैं। आपको एक ही संग्रह में लूपिंग द्वारा संग्रह में किसी आइटम को delete या remove नहीं माना जाता है। इसके बजाय संग्रह को Item.ChildNodes को एक खाली नए संग्रह में कॉपी करें, मूल संग्रह में लूप करने का प्रयास करें और नए संग्रह में आप जो आइटम चाहते हैं उसे हटाएं, लूप के दायरे से बाहर लूप करने के बाद फिर से संशोधित संग्रह को मूल में फिर से असाइन करें।

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

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