連載
» 2004年11月05日 05時00分 公開

.NET TIPS:Windowsフォームのロード時に任意のコントロールへフォーカスを設定するには?

Windowsアプリケーションで、Loadイベント・ハンドラによってフォーム上のコントロールにフォーカスを設定する場合、Focusメソッドは使えない。その代わりにはActiveControlプロパティを活用すればよい。C#とVB.NETでの使い方を解説する。

[一色政彦,デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 Windowsアプリケーションで、フォーム上のコントロールにフォーカスを設定する場合、通常ならそのコントロールのFocusメソッドを呼び出すことで、フォーカス設定を実現できる。しかし、フォームをロードするときに(つまりLoadイベント・ハンドラで)コントロールへフォーカスを設定する場合、Focusメソッドを呼び出しても設定はできない。

 そこで本稿では、この問題を回避して(Focusメソッドを使わずに)、Loadイベント・ハンドラで任意のコントロールへフォーカスを設定する方法を紹介する。

フォーム・ロード時のコントロールへのフォーカス設定

 例えば、次の画面のようなフォームを持つWindowsアプリケーションを作成したとする。

Windowsアプリケーションのフォーム Windowsアプリケーションのフォーム
フォームには、3つのButtonコントロールが配置されている。
  (1)[button1]コントロール。タブ・オーダーにおける先頭の項目であるため、既定では、このコントロールにフォーカスが自動設定される。
  (2)[button2]コントロール。
  (3)[button3]コントロール。

 このフォーム上には、[button1]コントロール、[button2]コントロール、[button3]コントロールという3つのButtonコントロールが配置されており、タブ・オーダーもこの順番で設定されている(タブ・オーダーについては、TIPS「Windowsフォームでタブ・オーダーを設定するには?」を参照してほしい)。よって、フォームをロードすると、自動的に[button1]コントロールにフォーカスが設定されてしまう。

 例えば、次のような[button2]コントロールへフォーカスを設定するコードをLoadイベント・ハンドラに記述しても、フォームがロードされるとやはり[button1]コントロールにフォーカスが行ってしまうのだ。

private void Form1_Load(object sender, System.EventArgs e)
{
  // ロード時にフォーカスを設定する
  this.button2.Focus();
}

任意のコントロールへのフォーカス設定に失敗するサンプル・コード(C#)
[button1]コントロールがタブ・オーダーの順番で最初のため、フォームがロードされると、[button2]コントロール(このコードでは、「this.button2」オブジェクト)ではなく、[button1]コントロールにフォーカスが設定されてしまう。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' ロード時にフォーカスを設定する
  Me.button2.Focus()
End Sub

任意のコントロールへのフォーカス設定に失敗するサンプル・コード(VB.NET)
[button1]コントロールがタブ・オーダーの順番で最初のため、フォームがロードされると、[button2]コントロール(このコードでは、「Me.button2」オブジェクト)ではなく、[button1]コントロールにフォーカスが設定されてしまう。

 この問題を回避して、[button2]コントロールや[button3]コントロールなどの任意のコントロールにフォーカスを設定するには、フォームのActiveControlプロパティにそのコントロールを設定すればよい。具体的には次のようなコード([button2]コントロールへフォーカスを設定する例)となる。

private void Form1_Load(object sender, System.EventArgs e)
{
  // ロード時にフォーカスを設定する
  this.ActiveControl = this.button2;
}

任意のコントロールへのフォーカス設定に成功するサンプル・コード(C#)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ' ロード時にフォーカスを設定する
  Me.ActiveControl = Me.button2
End Sub

任意のコントロールへのフォーカス設定に成功するサンプル・コード(VB.NET)

 このサンプル・コードを実行すると、次の画面のように、フォームのロード時に任意のコントロール(この例では「[button2]コントロール」)に対してフォーカスを正しく設定できる。

任意のコントロールにフォーカスが正しく設定されたフォーム 任意のコントロールにフォーカスが正しく設定されたフォーム
フォームのActiveControlプロパティに任意のコントロールを設定することで、フォームのロード時にそのコントロールへ自動的にフォーカスが設定される。
  (1)[button2]コントロール。フォームのロード時にフォーカスが設定されている。

 なお、ActiveControlプロパティの設定は、Loadイベント・ハンドラ以外に実装することも可能だ。例えば、Loadイベント・ハンドラよりも先に実行されるフォームのコンストラクタで(もちろんコントロールのインスタンスを生成した後に)、ActiveControlプロパティの設定を実装しても同様の結果が得られる。

カテゴリ:Windowsフォーム 処理対象:コントロール
使用ライブラリ:Controlクラス(System.Windows.Forms名前空間)
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
関連TIPS:Windowsフォームでタブ・オーダーを設定するには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。