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

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




foreach (Control x in this.Controls)
{
  if (x is LinkLabel)
  {
    LinkLabel ln = (LinkLabel)x;
    ln.Enabled = false;
  }
}

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

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

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

こんな感じで使う。

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

メソッドはこんな感じ。

/// <summary>
/// すべてのコントロールを得る(パネルに載っているコントロールも再帰的に探す)
/// </summary>
/// <param name="root"></param>
/// <returns></returns>
static public List<Control> getAllControls(Control root)
{
  List<Control> lst = new List<Control>();

  foreach (Control x in root.Controls)
  {
    lst.Add(x);
    lst.AddRange(getAllControls(x));
  }
  return lst;
}

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

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


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


コメント

このブログの人気の投稿

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