Windowsアプリケーションで、Loadイベント・ハンドラによってフォーム上のコントロールにフォーカスを設定する場合、Focusメソッドは使えない。その代わりにはActiveControlプロパティを活用すればよい。C#とVB.NETでの使い方を解説する。
Windowsアプリケーションで、フォーム上のコントロールにフォーカスを設定する場合、通常ならそのコントロールのFocusメソッドを呼び出すことで、フォーカス設定を実現できる。しかし、フォームをロードするときに(つまりLoadイベント・ハンドラで)コントロールへフォーカスを設定する場合、Focusメソッドを呼び出しても設定はできない。
そこで本稿では、この問題を回避して(Focusメソッドを使わずに)、Loadイベント・ハンドラで任意のコントロールへフォーカスを設定する方法を紹介する。
例えば、次の画面のようなフォームを持つWindowsアプリケーションを作成したとする。
このフォーム上には、[button1]コントロール、[button2]コントロール、[button3]コントロールという3つのButtonコントロールが配置されており、タブ・オーダーもこの順番で設定されている(タブ・オーダーについては、TIPS「Windowsフォームでタブ・オーダーを設定するには?」を参照してほしい)。よって、フォームをロードすると、自動的に[button1]コントロールにフォーカスが設定されてしまう。
例えば、次のような[button2]コントロールへフォーカスを設定するコードをLoadイベント・ハンドラに記述しても、フォームがロードされるとやはり[button1]コントロールにフォーカスが行ってしまうのだ。
private void Form1_Load(object sender, System.EventArgs e)
{
// ロード時にフォーカスを設定する
this.button2.Focus();
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ロード時にフォーカスを設定する
Me.button2.Focus()
End Sub
この問題を回避して、[button2]コントロールや[button3]コントロールなどの任意のコントロールにフォーカスを設定するには、フォームのActiveControlプロパティにそのコントロールを設定すればよい。具体的には次のようなコード([button2]コントロールへフォーカスを設定する例)となる。
private void Form1_Load(object sender, System.EventArgs e)
{
// ロード時にフォーカスを設定する
this.ActiveControl = this.button2;
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ロード時にフォーカスを設定する
Me.ActiveControl = Me.button2
End Sub
このサンプル・コードを実行すると、次の画面のように、フォームのロード時に任意のコントロール(この例では「[button2]コントロール」)に対してフォーカスを正しく設定できる。
なお、ActiveControlプロパティの設定は、Loadイベント・ハンドラ以外に実装することも可能だ。例えば、Loadイベント・ハンドラよりも先に実行されるフォームのコンストラクタで(もちろんコントロールのインスタンスを生成した後に)、ActiveControlプロパティの設定を実装しても同様の結果が得られる。
カテゴリ:Windowsフォーム 処理対象:コントロール
使用ライブラリ:Controlクラス(System.Windows.Forms名前空間)
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
関連TIPS:Windowsフォームでタブ・オーダーを設定するには?
Copyright© Digital Advantage Corp. All Rights Reserved.