Enterキーを押した時に、まるでTabキーを押した時のように、次のコントロールにフォーカスを移すEnterキーが押された時に、タブオーダーが次のコントロールにフォーカスを移動させるには、現在フォーカスのあるコントロールのKeyUpイベントでEnterキーが押されたかを調べ、Form.ProcessTabKeyメソッドを呼び出します。フォーム上にあるすべてのコントロールのKeyUpイベントでProcessTabKeyメソッドを呼び出すのは面倒ですので、フォームのKeyPreviewプロパティをTrueにして、フォームのKeyUpイベントでProcessTabKeyメソッドを呼び出せばよいでしょう。 [VB.NET] 'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As EventArgs) Handles MyBase.Load 'キーイベントをフォームで受け取る Me.KeyPreview = True 'KeyUpイベントハンドラを追加 AddHandler Me.KeyUp, AddressOf Form1_KeyUp End Sub 'KeyUpイベントハンドラ Private Sub Form1_KeyUp(ByVal sender As Object, _ ByVal e As KeyEventArgs) 'Enterキーが押されているか確認 If e.KeyCode = Keys.Enter Then 'あたかもTabキーが押されたかのようにする 'Shiftが押されている時は前のコントロールのフォーカスを移動 Me.ProcessTabKey(Not e.Shift) e.Handled = True End If End Sub [C#] //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //キーイベントをフォームで受け取る this.KeyPreview = true; //KeyUpイベントハンドラを追加 this.KeyUp += new KeyEventHandler(Form1_KeyUp); } //KeyUpイベントハンドラ private void Form1_KeyUp(object sender, KeyEventArgs e) { //Enterキーが押されているか確認 if (e.KeyCode == Keys.Enter) { //あたかもTabキーが押されたかのようにする //Shiftが押されている時は前のコントロールのフォーカスを移動 this.ProcessTabKey(!e.Shift); e.Handled = true; } } 補足:KeyUpイベントの代わりにKeyDownイベントを使うこともできます。ただし、例えばButtonコントロールにフォーカスがある時は、Enterキーの押下でKeyDownイベントは発生しません。よってKeyDownイベントハンドラでProcessTabKeyメソッドを呼び出した時は、Buttonコントロールにフォーカスがある時にEnterキーを押しても次のコントロールにフォーカスが移動しません。 補足:次のコントロールにフォーカスを移動させる方法は、ProcessTabKeyメソッドを呼び出す以外に、こちらで紹介しているような方法があります。 補足:単一行テキストボックスでEnterキーを押すと、ビープ音が鳴りますが、これを防ぐ方法は、こちらで紹介しています。 「Enter Instead of Tab」によると、この方法には幾つかの問題があります。 まず、フォームのAcceptButtonプロパティにButtonオブジェクトが設定されている時は、うまくいきません。よって、フォームのAcceptButtonプロパティには何も設定しないようにします。 また、複数行テキストボックスでは、Enterキーで次のコントロールにフォーカスが移動しないようにした方がよいでしょう。「Enter Instead of Tab」では、テキストボックスのMultilineとAcceptsReturnプロパティがTrueの時にフォーカスが移動しないようにするコードが紹介されています。 これに加えて、テキストボックスのMultilineとAcceptsReturnプロパティがTrueの時と、リッチテキストボックスの時は、Ctrlキーを押しながらEnterキーを押すことにより、フォーカスが移動しないようにするコードを以下に示します。 [VB.NET] 'KeyDownイベントハンドラ Private Sub Form1_KeyUp(ByVal sender As Object, _ ByVal e As KeyEventArgs) 'Enterキーが押されているか確認 If e.KeyCode = Keys.Enter Then '複数行テキストボックスのときは、何もしない If TypeOf (Me.ActiveControl) Is TextBox Then Dim tb As TextBox = CType(Me.ActiveControl, TextBox) If tb.Multiline AndAlso (tb.AcceptsReturn OrElse e.Control) Then Return End If End If 'リッチテキストボックスのときは、何もしない If TypeOf (Me.ActiveControl) Is RichTextBox AndAlso e.Control Then Return End If 'あたかもTabキーが押されたかのようにする 'Shiftが押されている時は前のコントロールのフォーカスを移動 Me.ProcessTabKey(Not e.Shift) e.Handled = True End If End Sub [C#] //KeyDownイベントハンドラ private void Form1_KeyUp(object sender, KeyEventArgs e) { //Enterキーが押されているか確認 if (e.KeyCode == Keys.Enter) { //複数行テキストボックスのときは、何もしない if (this.ActiveControl is TextBox) { TextBox tb = (TextBox)this.ActiveControl; if (tb.Multiline && (tb.AcceptsReturn || e.Control)) return; } //リッチテキストボックスのときは、何もしない if (this.ActiveControl is RichTextBox && e.Control) return; //あたかもTabキーが押されたかのようにする //Shiftが押されている時は前のコントロールのフォーカスを移動 this.ProcessTabKey(!e.Shift); e.Handled = true; } } 注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。
|
|
Copyright 2002-2008 DOBON!. All rights reserved.
|