I have written a few extensions to Control.ControlCollection class for Winforms.
These extensions are lambda expression wrappers and other useful API.
You can also write LINQ queries against the ControlCollection using an extension.
Extensions :
using System; using System.Collections.Generic; using System.Windows.Forms;
namespace System.Windows.Forms { public static class ControlCollectionExtensions { public static void ForEach(this Control.ControlCollection ControlCollection, Action<Control> Action) { for (int i = 0; i < ControlCollection.Count; i++) { Action.Invoke(ControlCollection[i]); } } public static void For(this Control.ControlCollection ControlCollection, int Start, int End, int Step, Action<Control> Action) { for (int i = Start; i < End; i++) { Action.Invoke(ControlCollection[i]); } } public static void For(this Control.ControlCollection ControlCollection, int Start, Func<int, bool> End, int Step, Action<Control> Action) { for (int i = Start; End.Invoke(i); i++) { Action.Invoke(ControlCollection[i]); } } public static List<Control> Where(this Control.ControlCollection ControlCollection, Func<Control, bool> Condition, bool SearchAllChildren) { List<Control> lstControls = new List<Control>(); ControlCollection.ForEach(ctrl => { if (SearchAllChildren) { lstControls.AddRange(ctrl.Controls.Where(Condition, true)); } if (Condition.Invoke(ctrl)) lstControls.Add(ctrl); }); return lstControls; } public static List<Control> FindControlsByType(this Control.ControlCollection ControlCollection, Type Type, bool SearchAllChildren) { List<Control> lstControls = new List<Control>(); ControlCollection.ForEach(ctrl => { if (SearchAllChildren) { lstControls.AddRange(ctrl.Controls.FindControlsByType(Type, true)); } if (ctrl.GetType() == Type) lstControls.Add(ctrl); });
return lstControls; } public static List<Control> ToList(this Control.ControlCollection ControlCollection, bool IncludeChildren) { List<Control> lstControls = new List<Control>(); ControlCollection.ForEach(ctrl => { if (IncludeChildren) lstControls.AddRange(ctrl.Controls.ToList(true)); lstControls.Add(ctrl); }); return lstControls; } } }
|
Sample Usage :
//Find control of type RichTextBox List<Control> lstControls = this.Controls.FindControlsByType(typeof(RichTextBox), true);
//Where control Name is rtbScratchPad List<Control> lstControls1 = this.Controls.Where(ctrl => ctrl.Name == "rtbScratchPad", true);
//For each control in the collection this.Controls.ForEach(ctrl => MessageBox.Show(ctrl.Name));
//For every second control in the collection this.Controls.For(0, this.Controls.Count - 1, 2, ctrl => MessageBox.Show(ctrl.Name));
//LINQ query on ControlCollection using ToList() extension Control c = (from ctrl in this.Controls.ToList(true) where ctrl.Name == "rtbScratchPad" select ctrl).Single();
|
Join the conversation! Your thoughts help the community grow.