2010-02-05 17 views
13

Kullanarak belirli türdeki tüm alt denetimleri bulunur. MyControl1.Controls.OfType<RadioButton>(), yalnızca ilk koleksiyonu arar ve çocuklara girmez.Enumerable.OfType <T>() veya LINQ

Enumerable.OfType<T>() veya LINQ'u kullanarak kendi özyinelemeli yöntemi yazmadan tüm özel çocuk denetimlerini bulmak mümkün mü? this gibi.

cevap

40

ben kontrol hiyerarşisi dümdüz ve ardından filtreler uygulamak için bir uzantısı yöntemi kullanmak, böylece kendi özyinelemeli yöntemi kullanarak bu.

varsayım:

yöntem bu jenerik özyinelemeli yöntemini kullanın

//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

Lütfen bir kod örneği verebilir misiniz? – abatishchev

+1

emin, paylaşım için, kod sayesinde kodun –

+1

Gerçekten güzel bir parça eklendi! –

1

benziyor Bu yöntemin kontrolü ise yönteme göre daha T gerçekten çocuklarda görünmüyor olmasıdır. Çocuklarına bakmaya da ihtiyacınız varsa, bunu kolayca değiştirebilirsiniz.

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; 
} 
1

dönüş türünü değiştirmek için mantıklı olur cevap yukarıda geliştirmek bu

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