C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: KeyDown処理


(過去ログ 115 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■67641 / inTopicNo.1)  KeyDown処理
  
□投稿者/ 青花 (15回)-(2013/08/20(Tue) 12:04:44)

分類:[VB.NET/VB2005 以降] 

TextBoxやコンボボックスのKeyDown処理で、下記のコーディングをしています。

Private Sub TextBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox.KeyDown

    Dim KeyCode As Short = e.KeyCode
Dim Shift As Short = e.KeyData \ &H10000
If KeyCode = System.Windows.Forms.Keys.Tab OrElse KeyCode = System.Windows.Forms.Keys.Return Then
If (Shift And VB6.ShiftConstants.ShiftMask) > 0 Then
BackTextBox.Focus()
Else
NextTextBox.Focus()
End If
End If
End Sub

うまく、タブが移動してくれません。
各プロパティのTabStopもFalseにしています。

それでも、思うようにいきません

お解りの方よろしくお願いします

OSは、Win7
.Netのバージョンは、VB.Net2008です。


よろしくお願いします。
引用返信 編集キー/
■67642 / inTopicNo.2)  Re[1]: KeyDown処理
□投稿者/ Hongliang (83回)-(2013/08/20(Tue) 13:34:11)
Enterなどはコントロールによっては特殊なキーとして処理されており、KeyDownイベントを発生させないケースがあります。
(Form自身も、AcceptButtonがあればそれのクリック用として特殊キー扱いしたりします)
http://www.atmarkit.co.jp/fdotnet/dotnettips/243winkeyproc/winkeyproc.html
Form(または派生させたTextBox等)でProcessDialogKeyをオーバーライドし、そこにフォーカスを移動させる処理を記述します。
ActiveControlプロパティなどが使えるでしょう。
なお、FocusメソッドよりもSelectNextControlの方がいろいろ柔軟で便利です。
// タブオーダーに従わないフォーカス移動をさせたいのなら仕方ありませんが…。

> Dim KeyCode As Short = e.KeyCode

KeyEventArgs.KeyCodeはKeys型なので、受け取る方もKeys型にすべきです。

> If KeyCode = System.Windows.Forms.Keys.Tab OrElse KeyCode = System.Windows.Forms.Keys.Return Then

タブオーダーに逆らわないのであれば、敢えてTabの時の処理は書かずともデフォルト処理に任せるだけで十分では。

> Dim Shift As Short = e.KeyData \ &H10000
> If (Shift And VB6.ShiftConstants.ShiftMask) > 0 Then

KeyEventArgsにはShiftプロパティがあります。わざわざこういう演算をする必要はありません。

引用返信 編集キー/
■67794 / inTopicNo.3)  Re[2]: KeyDown処理
□投稿者/ YM (13回)-(2013/09/02(Mon) 21:11:11)

http://dobon.net/vb/dotnet/control/enterliketab.html
http://blog.livedoor.jp/akf0/archives/51318097.html

あれから、上記のHP参考にやってみましたが、上手くいきません。

一応、Private Sub BaseForm_KeyDown(ByVal sender As Object,ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown

のなかで
If e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Tab Then
Me.ProcessTabKey(Not e.Shift)
e.Handled = True
End If



If e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Tab Then
    Me.SelectNextControl(Me.ActiveControl, True, True, True, True)
End If

を書いてみましたが無理でした。

デザイン側のプロパティの、TabIndexの番号も被っていないかチェックし、TabStopもTrueにしました。
それでも、上手くいきません


なにかいい方法はありませんか?
よろしくお願いします。
引用返信 編集キー/
■67805 / inTopicNo.4)  Re[3]: KeyDown処理
□投稿者/ 青花 (16回)-(2013/09/03(Tue) 13:20:42)
KeyDownイベントで、Tabを押下した時のイベントは拾えないのですか?

If e.KeyCode = Keys.Tab Then

と、書いても拾えません。

ご存知の方、よろしくお願いします

引用返信 編集キー/
■67806 / inTopicNo.5)  Re[4]: KeyDown処理
□投稿者/ オショウ (88回)-(2013/09/03(Tue) 13:50:48)
> KeyDownイベントで、Tabを押下した時のイベントは拾えないのですか?

  高級言語使っていたら、なかなか解らない現象なんですが・・・

  Downイベントの後、必ず、Upイベントが発生しますので、その間の
  フォーカス移動は、大抵無視されると言うか、フォーカスが戻って
  くる為、処理が無視されたように見えます。

  よって、Downで処理すべきではない。と言うことです。

※ C++等でウィンドウメッセージを各々処理するコードを書いていたら
  メッセージの順序が明確にわかるので、こういう問題にはなりにくい
  のですが。

以上。参考まで
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -