2009-05-05 11 views
7

एक TreeView में सभी नोड्स के माध्यम से आसानी से कैसे पुनरावृत्ति कर सकता है, उनकी जांच की गई। जांच की गई संपत्ति और फिर सभी चेक किए गए नोड्स को हटाएं?वृक्ष दृश्य से चेक किए गए आइटम को कुशलतापूर्वक कैसे हटाएं?

यह सीधा लगता है, लेकिन आपको एक ऐसे संग्रह को संशोधित नहीं करना चाहिए जिसके माध्यम से आप पुनरावृत्ति कर रहे हैं, "foreach" लूप की संभावना को खत्म कर दें। (.Nodes.Remove कॉल संग्रह को संशोधित कर रहा है।) यदि इसका प्रयास किया जाता है, तो प्रभाव यह है कि केवल आधे के बारे में। चेक किए गए नोड हटा दिए जाते हैं।

भले ही कोई दो पास का उपयोग कर रहा हो: पहले अस्थायी अनुक्रमणिका की एक सूची बनाना, और फिर दूसरे पास पर इंडेक्स द्वारा निकालना - सूचकांक सूची की अखंडता को आक्रमण करने पर सूचकांक प्रत्येक निष्कासन पर बदल जाएगा।

तो, ऐसा करने का सबसे प्रभावी तरीका क्या है?

यहाँ कोड है कि अच्छा लग रहा है का एक उदाहरण है, लेकिन वास्तव में केवल .Checked नोड्स .: के बारे में आधे को हटा

  foreach (TreeNode parent in treeView.Nodes) 
      { 
       if (parent.Checked) 
       { 
        treeView.Nodes.Remove(parent); 
       } 
       else 
       { 
        foreach (TreeNode child in parent.Nodes) 
        { 
         if (child.Checked) parent.Nodes.Remove(child); 
        } 
       } 
      } 

(हाँ, इरादा केवल एक पेड़ है कि दो से नोड्स छँटाई करने के लिए है स्तर गहरे।)

उत्तर

6

इससे उन्हें गणना के बाद नोड्स निकाल दिया जाएगा और नोड्स के एन-स्तरों के लिए रिकर्सिवली इस्तेमाल किया जा सकता।

void RemoveCheckedNodes(TreeNodeCollection nodes) 
{ 
    List<TreeNode> checkedNodes = new List<TreeNode>(); 

    foreach (TreeNode node in nodes) 
    { 
     if (node.Checked) 
     { 
      checkedNodes.Add(node); 
     } 
     else 
     { 
      RemoveCheckedNodes(nodes.ChildNodes); 
     } 
    } 

    foreach (TreeNode checkedNode in checkedNodes) 
    { 
     nodes.Remove(checkedNode); 
    } 
} 
1

जबकि पुनरावृत्त करने से आप अनचेक किए गए आइटम की एक नई सूची बना सकते हैं और फिर उस नई सूची में अपने वृक्षदृश्य को फिर से बांध सकते हैं (पुराने को छोड़कर)।

7

पीछे नोड्स के माध्यम से चलने का प्रयास करें। उस स्थिति में आपके सूचकांक पिछले अपने नोड आकार में वृद्धि नहीं करता है:

 
for(int ndx = nodes.Count; ndx > 0; ndx--) 
{ 
    TreeNode node = nodes[ndx-1]; 
    if (node.Checked) 
    { 
    nodes.Remove(node); 
    } 
    // Recurse through the child nodes... 
} 
+0

यह सबसे प्रभावी तरीका है। – Romias

+0

पुराना सवाल, लेकिन इसके लिए +1 सबसे प्रभावी तरीका है। – TimFoolery

+0

रिविजिटिंग इस ... कुछ संशोधनों यह कभी तो थोड़ा जल्दी ... होगा के लिए लूप शीर्षक में निम्न परिवर्तन: 'पूर्णांक NDX = nodes.Count-1' और' NDX> = 0' आप की अनुमति देगा लूप के माध्यम से प्रत्येक पास में होता है -1 से बचने के लिए। चीजों की भव्य योजना में, कुछ अतिरिक्त घटाव का मतलब बिल्कुल नहीं होगा, लेकिन हे ... क्यों नहीं? – TimFoolery

3

आप इसे करना चाहते हैं तो कुशलता से आप की जाँच नोड्स का ट्रैक रखने के रूप में वे जाँच कर रहे हैं की जरूरत है। किसी सूची में चेक किए गए पेड़ नोड्स को स्टोर करें (और उन्हें अनचेक किए जाने के बाद हटा दें)।

यदि आपके पास एक अनन्य कुंजी है और आपके ट्रैक रखने के लिए बहुत सारे नोड्स भी एक शब्दकोश पर विचार कर सकते हैं। लेकिन अगर आप केवल 10-50 से निपट रहे हैं तो शायद यह एक बड़ा अंतर नहीं करेगा।

फिर, बजाय अपने (छोटे) नोड्स की सूची के माध्यम से पूरे पेड़ के माध्यम से आप बस पाश पाशन की।

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