画面のコントロールをまとめて操作する

画面のコントロールをまとめて何かしたいときの手順。たとえば、リンクラベルを全部無効にしたいとき。(2016/12/21改訂)




  1. foreach (Control x in this.Controls)
  2. {
  3.   if (x is LinkLabel)
  4.   {
  5.     LinkLabel ln = (LinkLabel)x;
  6.     ln.Enabled = false;
  7.   }
  8. }

LinkLableが文字列なのが今ひとつのような。

ところが、パネルに載っているコントロールはthis.Controlsには含まれないので、悲しいことになる。

仕方がないので、再帰的にすべてのコントロールを得るメソッドを作ってみる。

こんな感じで使う。

  1. foreach (Control x in getAllControls(this)) { }

メソッドはこんな感じ。

  1. /// <summary>
  2. /// すべてのコントロールを得る(パネルに載っているコントロールも再帰的に探す)
  3. /// </summary>
  4. /// <param name="root"></param>
  5. /// <returns></returns>
  6. static public List<Control> getAllControls(Control root)
  7. {
  8. List<Control> lst = new List<Control>();
  9.  
  10. foreach (Control x in root.Controls)
  11. {
  12. lst.Add(x);
  13. lst.AddRange(getAllControls(x));
  14. }
  15. return lst;
  16. }

Linqで書くとこんな感じかな。

  1. getAllControls(this)
  2.   .Where(ct => ct is LinkLabel)
  3.   .ToList().ForEach(ln => ln.Enabled = ln.Text != "0");


参考にしたページ。http://www.atmarkit.co.jp/fdotnet/dotnettips/224controls/controls.html


コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。