获取特定types的所有控件
我有多个pictureboxes,我需要在运行时加载随机图像。 所以我认为有一个所有的图片盒的集合,然后使用一个简单的循环分配图像给他们会很好。 但我该怎么做呢? 或者也许还有其他更好的解决scheme来解决这个问题吗?
使用一点LINQ:
foreach(var pb in this.Controls.OfType<PictureBox>()) { //do stuff }
但是,这只会照顾主容器中的PictureBoxes。
你可以使用这个方法:
public static IEnumerable<T> GetControlsOfType<T>(Control root) where T : Control { var t = root as T; if (t != null) yield return t; var container = root as ContainerControl; if (container != null) foreach (Control c in container.Controls) foreach (var i in GetControlsOfType<T>(c)) yield return i; }
那么你可以做这样的事情:
foreach (var pictureBox in GetControlsOfType<PictureBox>(theForm)) { // ... }
如果你至less在.NET 3.5上,那么你有LINQ,这意味着,因为ControlCollection
实现了IEnumerable
你可以这样做:
var pictureBoxes = Controls.OfType<PictureBox>();
这是另一个版本,因为现有的提供的不是我所想的。 这可以作为一个扩展方法,可选地,它不包括检查根/父容器的types。 这个方法基本上是“获取所有typesT的后代控件”方法:
public static System.Collections.Generic.IEnumerable<T> ControlsOfType<T>(this System.Web.UI.Control control) where T: System.Web.UI.Control{ foreach(System.Web.UI.Control childControl in control.Controls){ if(childControl is T) yield return (T)childControl; foreach(var furtherDescendantControl in childControl.ControlsOfType<T>()) yield return furtherDescendantControl; } }
我使用这个通用的recursion方法:
这种方法的假设是,如果控制是T而不是方法不看在它的孩子。 如果你还需要看看它的孩子,你可以很容易地相应地改变它。
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; }
public static List<T> FindControlByType<T>(Control mainControl,bool getAllChild = false) where T :Control { List<T> lt = new List<T>(); for (int i = 0; i < mainControl.Controls.Count; i++) { if (mainControl.Controls[i] is T) lt.Add((T)mainControl.Controls[i]); if (getAllChild) lt.AddRange(FindControlByType<T>(mainControl.Controls[i], getAllChild)); } return lt; }