Przejdź do treści

DevStyle - Strona Główna
C# Power ponownie – Control.AllChildControls

C# Power ponownie – Control.AllChildControls

Maciej Aniserowicz

30 sierpnia 2008

Backend

Tagi:

Podczas przygotowywania kolejnego posta z serii “Samples” zaimplementowało mi się coś bardzo fajnego, co chyba zasługuje na osobną notkę. Oto zatem kolejna krótka demonstracja potęgi połączonych mechanizmów C# (v. 2 i 3).
Scenariusz: mamy formatkę wypełnioną panelami, groupboxami, layoutami i wszystkimi innymi kontenerami jakie tam jeszcze Bozia z Redmond na toolbox wrzuciła. Nachodzi nas chętka na wykonanie pewnej operacji na WSZYSTKICH kontrolkach zawartych w oknie, niezależnie od tego gdzie są zagnieżdżone. Jak się do nich dobrać? Here comes the beauty of YIELD:

  1:  public static IEnumerable<Control> AllChildControls(this Control instance)
  2:  {
  3:  	foreach (Control control in instance.Controls)
  4:  	{
  5:  		yield return control;
  6:  		foreach (Control childControl in control.AllChildControls())
  7:  			yield return childControl;
  8:  	}
  9:  }

Wykorzystajmy to w jakimś interesującym przypadku… na przykład pod każdy TextBox podepnijmy ToolTipa pokazującego aktualną wartość właściwości Tag. Warunki z tego wynikające są dwa: kontrolka-dziecko musi być TextBoxem i jej Tag nie może być null. Na potęgę posępnego czerepu, LINQ przybywaj!!!

  1:  this.AllChildControls().OfType<TextBox>()
  2:  	.Where(tb => tb.Tag != null).ToList()
  3:  	.ForEach(tb => toolTip.SetToolTip(tb, tb.Tag.ToString()));

Może to jakieś zaćmienie, może za dużo kodowania bez przerwy, może nie widzę innego równie wyśmienitego rozwiązania, ale… jestem pod wrażeniem. Jak wyglądałby kod robiący to samo jeszcze kilkanaście miesięcy temu? Pewnie jakoś tak. Nie uzależniajmy się od technologii, ale wykorzystujmy w pełni to co nam oferuje!

Zobacz również