Find all child controls of specific type using Enumerable.OfType() or LINQ

前端 未结 3 580
野性不改
野性不改 2020-11-30 07:39

Existed MyControl1.Controls.OfType() searches only thru initial collection and do not enters to children.

Is it possible to find all

相关标签:
3条回答
  • 2020-11-30 08:19

    To improve above answer it would make sense to change the return type to

    //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>();
    }
    
    0 讨论(0)
  • 2020-11-30 08:23

    I use this generic recursive method:

    The assumption of this method is that if the control is T than the method does not look in its children. If you need also to look to its children you can easily change it accordingly.

    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;
    }
    
    0 讨论(0)
  • 2020-11-30 08:25

    I use an extension method to flatten control hierarchy and then apply filters, so that's using own recursive method.

    The method looks like this

    public static IEnumerable<Control> FlattenChildren(this Control control)
    {
      var children = control.Controls.Cast<Control>();
      return children.SelectMany(c => FlattenChildren(c)).Concat(children);
    }
    
    0 讨论(0)
提交回复
热议问题