2012-06-22 3 views
8

के हैं मैं एक WPF Panel (जैसे उदाहरण के लिए Canvas) और मैं इसकी Children दूर करने के लिए ही करता है, तो इन बच्चों उदाहरण प्रकार Button के सभी के लिए, टाइप करें T के हैं चाहता हूँ।कक्ष से बच्चों को निकालें केवल तभी प्रकार टी

मैं यह कैसे कर सकता हूं? क्या मैं LINQ का उपयोग कर सकता हूं?

उत्तर

10

आप LINQ उपयोग कर सकते हैं, ऐसा करने का एक तरीका है।

canvas1.Children.OfType<Button>().ToList().ForEach(b => canvas1.Children.Remove(b)); 

या आप सभी चाइल्ड तत्वों के बावजूद लूप कर सकते हैं और यदि यह बटन उन्हें एक सूची में जोड़ता है और अंत में उन्हें हटा देता है। फ़ोरैच लूप के अंदर बटन न हटाएं।

List<Button> toRemove = new List<Button>(); 
foreach (var o in canvas1.Children) 
{ 
    if (o is Button) 
     toRemove.Add((Button)o); 
} 
for (int i = 0; i < toRemove.Count; i++) 
{ 
    canvas1.Children.Remove(toRemove[i]); 
} 

LINQ रास्ता अधिक पठनीय और सरल और कम कोडिंग है।

+2

अंत में, सरल और सही। धन्यवाद! प्रदर्शन के बारे में कुछ नोट्स? – Nick

+0

@Nick LINQ और सामान्य पर प्रदर्शन अंतर नहीं होगा, मैंने LINQ रास्ता पसंद किया। यह तय करना आपकी पसंद है कि आपने कौन सा पसंदीदा – Damith

+2

नीचे मतदाता कृपया एक टिप्पणी छोड़ दी है, अगर यहां कुछ गड़बड़ है – Damith

0

कुछ LINQ:

सभी गलतियों लोगों के लिए
panel1.Controls.OfType<Button>().ToList().ForEach((b) => b.Parent = null); 

क्षमा करें। सुधार और परीक्षण किया गया।

+2

-1 पैनल। नियंत्रण? क्या आपने परीक्षण किया है? http://msdn.microsoft.com/en-us/library/system.windows.controls.panel – Nick

+0

** - 1 ** 'बच्चे। ओफटाइप

+0

पुन: प्रयास करें .. लेकिन कृपया सुनिश्चित हो। – Nick

3

बस एक प्रकार की तुलना करें। मुश्किल हिस्सा संग्रह को संशोधित कर रहा है जबकि आप इसके माध्यम से लूप कर रहे हैं; मैं छोरों के लिए दो का उपयोग करके ऐसा किया:

var ToRemove = new List<UIElement>(); 
Type t = typeof(Button); 
for (int i=0 ; i<MyPanel.Children.Count ; i++) 
{ 
    if (MyPanel.Children[i].GetType()) == t) 
     ToRemove.Add(MyPanel.Children[i]); 
} 
for (int i=0 ; i<ToRemove.Length ; i++) MyPanel.Children.Remove(ToRemove[i]); 

संपादित

इस तरह, क्लीनर है संग्रह के अंत से पाशन, इतनी के रूप में पाश अंदर से आइटम हटाने के लिए।

Type t = typeof(Button); 
for (int i=MyPanel.Children.Count-1 ; i>=0 ; i--) 
{ 
    if (MyPanel.Children[i].GetType()) == t) 
     MyPanel.Children.RemoveAt(i); 
} 
+1

लूप के लिए जो लूप करता है संग्रह के अंत को 'MyPanel.Children.Count - 1' से शुरू करने की आवश्यकता है, अन्यथा आपको' IndexOutOfRangeException' मिलेगा। –

+0

@ निकोलाएन्यूसेव धन्यवाद, तय। – McGarnagle

0

इस बंद मेरे फोन Winging:

foreach(object o in MyPanel.Children) 
{ 
    if(o.GetType() == typeof(Button)) 
    { 
     MyPanel.Children.Remove(o); 
    } 
} 
+3

यह काम नहीं करेगा क्योंकि आप इसे संग्रह से वस्तुओं को हटा नहीं सकते हैं, जबकि इसे फ़ोरैच के साथ फिर से चालू किया जा रहा है। –

+0

आह, वे आईफोन के लिए वीएस कब बनाएंगे, इसलिए मैं अपने कोड का पहले परीक्षण कर सकता हूं = पी – Jmyster

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