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