.NET TIPS

Windowsフォーム上のコントロールを検索するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/07/28

 Windowsフォーム上に配置されているコントロール群の中から、特定のコントロールをコントロールの名前(コントロールのNameプロパティの値)で検索するには、.NET Framework 1.xではフォームのControlsプロパティからすべてのコントロールを列挙して検索するしか方法はなかった。

 これは例えば次のようなコードとなる。

// 「button1」という名前のコントロールを検索
Control target = null;

foreach (Control c in this.Controls) { // thisはフォームを参照
  if (c.Name == "button1") {
    target = c;
    break;
  }
}

if (target != null) {
  // コントロールを発見
}
' 「Button1」という名前のコントロールを検索
Dim target As Control = Nothing

For Each c As Control In Me.Controls ' Meはフォームを参照
  If c.Name = "Button1" Then
    target = c
    Exit For
  End If
Next

If target IsNot Nothing Then
  ' コントロールを発見
End If
.NET Framework 1.xにおけるコントロールの検索方法(上:C#、下:VB)

 なおこのコードでは、PanelコントロールやGroupBoxコントロールなどのコンテナ・コントロール内に含まれるコントロールまでは検索できない。これについては「TIPS:Windowsフォーム上のすべてのコントロールを列挙するには?」を参照していただきたい。

 フォームのControlsプロパティにセットされるオブジェクトは、コントロールのコレクションであるControl.ControlCollectionクラス(System.Windows.Forms名前空間)のオブジェクトだ*

* Control.ControlCollectionクラスはControlクラス内で定義されている内部クラス(インナー・クラス)。

 .NET Framework 2.0では、このControl.ControlCollectionクラスにコントロールを検索するための2つの方法が新しく追加されている。

文字列が指定可能なインデクサ(Itemプロパティ)

 その1つ目の方法は、Control.ControlCollectionクラスに新しく追加された、文字列をパラメータに取るインデクサ(VBではItemプロパティとしてアクセスされる)を使う方法である。

 Control.ControlCollectionクラスのインデクサには、.NET Framework 1.xではパラメータとしてインデックス番号しか指定できなかったが、.NET Framework 2.0ではコントロール名が指定可能になっている。よって次のようなコードにより簡単にコントロールを検索できる。

// 「button1」という名前のコントロールを検索
Control target = this.Controls["button1"];

if (target != null) {
  // コントロールを発見
}
' 「Button1」という名前のコントロールを検索
Dim target As Control = Me.Controls("Button1")

If target IsNot Nothing Then
  ' コントロールを発見
End If
インデクサによるコントロールの検索(上:C#、下:VB)

 もちろんこの場合でも、コンテナ・コントロール内に含まれるコントロールまでは検索できない(次に述べる方法では可能)。

Findメソッド

 2つ目の方法は、.NET Framework 2.0で新しくControl.ControlCollectionクラスに追加されたFindメソッドを使う方法だ。

 このFindメソッドでは、第1パラメータに検索するコントロールの名前、第2パラメータにはフォーム上のすべてのコントロールから検索するかどうかをブール値(trueかfalse)で指定する。なお、戻り値はコントロールの配列となるので注意が必要だ。

// 「button1」という名前のコントロールを検索
Control target = null;

Control[] targets = this.Controls.Find("button1", false);
if (targets.Length > 0) {
  target = targets[0];
}

if (target != null) {
  // コントロールを発見
}
' 「Button1」という名前のコントロールを検索
Dim target As Control = Nothing

Dim targets As Control() = Me.Controls.Find("Button1", False)
If targets.Length > 0 Then
  target = targets(0)
End If

If target IsNot Nothing Then
  ' コントロールを発見
End If
Findメソッドによるコントロールの検索(上:C#、下:VB)

 Findメソッドでは第2パラメータにtrueを指定すれば、コンテナ・コントロール内に含まれるコントロールも検索される。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:コントロール
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
使用ライブラリ:Control.ControlCollectionクラス(System.Windows.Forms名前空間)
関連TIPS:Windowsフォーム上のすべてのコントロールを列挙するには?

この記事と関連性の高い別の.NET TIPS
Windowsフォーム上のすべてのコントロールを列挙するには?
WindowsアプリケーションをWindows XPスタイルの外観にするには?
VS.NETで効率よくキーワード検索を行うには?
Windowsフォームでグループ化されたコントロールのタブ・オーダーを設定するには?
コントロールに対するキー入力をフォームで処理するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間