2010-02-05 10 views
13

का उपयोग करके विशिष्ट प्रकार के सभी बाल नियंत्रण खोजें MyControl1.Controls.OfType<RadioButton>() केवल प्रारंभिक संग्रह के माध्यम से खोज करता है और बच्चों में प्रवेश नहीं करता है।Enumerable.OfType <T>() या LINQ

क्या Enumerable.OfType<T>() या LINQ का उपयोग करके विशिष्ट प्रकार के सभी बाल नियंत्रणों को अपने रिकर्सिव विधि के बिना खोजना संभव है? this की तरह।

उत्तर

40

मैं नियंत्रण पदानुक्रम को फ़्लैट करने के लिए एक विस्तार विधि का उपयोग करता हूं और फिर फ़िल्टर लागू करता हूं, ताकि वह स्वयं की रिकर्सिव विधि का उपयोग कर सके।

विधि इस

public static IEnumerable<Control> FlattenChildren(this Control control) 
{ 
    var children = control.Controls.Cast<Control>(); 
    return children.SelectMany(c => FlattenChildren(c)).Concat(children); 
} 
+1

क्या आप कोड का एक उदाहरण प्रदान कर सकते हैं? – abatishchev

+1

यकीन है, कोड –

+1

कोड जोड़ा गया वास्तव में कोड का अच्छा टुकड़ा, साझा करने के लिए धन्यवाद! –

1

तरह लग रहा है इस सवाल का जवाब ऊपर सुधार करने के लिए यह मतलब होगा

//Returns all controls of a certain type in all levels: 
public static IEnumerable<TheControlType> AllControls<TheControlType>(this Control theStartControl) where TheControlType : Control 
{ 
    var controlsInThisLevel = theStartControl.Controls.Cast<Control>(); 
    return controlsInThisLevel.SelectMany(AllControls<TheControlType>).Concat(controlsInThisLevel.OfType<TheControlType>()); 
} 

//(Another way) Returns all controls of a certain type in all levels, integrity derivation: 
public static IEnumerable<TheControlType> AllControlsOfType<TheControlType>(this Control theStartControl) where TheControlType : Control 
{ 
    return theStartControl.AllControls().OfType<TheControlType>(); 
} 
1

मैं इस सामान्य पुनरावर्ती विधि का उपयोग वापसी प्रकार बदलने के लिए:

धारणा इस विधि का यह है कि अगर नियंत्रण टी से विधि टी है तो अपने बच्चों में नहीं दिखता है। यदि आपको अपने बच्चों को देखने की भी आवश्यकता है तो आप इसे तदनुसार आसानी से बदल सकते हैं।

public static IList<T> GetAllControlsRecusrvive<T>(Control control) where T :Control 
{ 
    var rtn = new List<T>(); 
    foreach (Control item in control.Controls) 
    { 
     var ctr = item as T; 
     if (ctr!=null) 
     { 
      rtn.Add(ctr); 
     } 
     else 
     { 
      rtn.AddRange(GetAllControlsRecusrvive<T>(item)); 
     } 

    } 
    return rtn; 
} 
संबंधित मुद्दे