- PR -

テキストボックスでのtabキーEnterキーの扱いについて

投稿者投稿内容
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-09-14 09:45
C#で開発中です。
フォーム内でのキーイベントの扱いについて教えてください。
テキストボックスで何かコードを入力してEnterキーまたはTabキーが押されたら何らかの処理をして次のTab設定されている項目に移動したいのですがうまくいきません。
ソースは
private void CODE1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
switch(e.KeyCode.ToString()){
case "Enter":
case "Tab":
M10FormSet(CODE1.Text);
       break; }
・・・以下省略
こんな感じで、keyDowneイベントでkeyCodeを判定しているのですが、EnterはうまくうごくのですがTabがとれません。書き方がいけないのでしょうか?イベントの発生タイミングがよくわからないのです。初歩的な質問ですみませんがどなたか教えてください。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-09-14 10:05
引用:

こんな感じで、keyDowneイベントでkeyCodeを判定しているのですが、EnterはうまくうごくのですがTabがとれません。書き方がいけないのでしょうか?イベントの発生タイミングがよくわからないのです。初歩的な質問ですみませんがどなたか教えてください。



書き方がよくないです。
ToString() は余分です。

コード:
private void CODE1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
switch(e.KeyCode){ 
case Keys.Enter: 
case Keys.Tab: 
M10FormSet(CODE1.Text); 



あと、Form.ProcessTabKey() について調べてみた方がいいかもしれません。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-09-14 10:17
Control.IsInputKey()でtrueを返せばTabもKeyDownを受けられるかも。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13631&forum=7
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-09-14 10:56
渋木さん、一郎さん ありがとうございます。さっそくためしてみます!
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-09-14 12:03
早速やってみたのですが・・・
protected override bool IsInputKey(Keys keyData)
{
if(keyData == Keys.Enter || keyData == Keys.Tab)
return true;
else
return false;
}
と書いて、CODE1_KeyDown(keyUpでも書いてみました)で

if(IsInputKey(e.KeyData))  ←(e.KeyCode)
    処理・・・
で処理してみましたが、Enterはとれるのですが、Tabはやはり取れませんでした。
(メッセージを表示して確認しました)
ソースを書くイベントの場所がわるいのでしょうか?
それともなにかとっても勘違いしているのでしょうか?
渋木さんに書いていただいたやり方でもやはりTabはとれませんでした。
画面上では、たとえば 3 といれてTabを押すと 何の処理もせず、つぎのタブ位置にとんでいってしまいます。コントロールが離れるLeaveの時にkeyCodeがとれないかと思ってかいてみましたが、Keyイベントは発生しないですもんね。。とれませんでした。
うーーー。どーしたらいいですかね(;
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-09-14 13:57
え〜っとですね・・・・・・

私の示したリンク先をもう一度読んでみてください。

[ メッセージ編集済み 編集者: 一郎 編集日時 2004-09-14 13:58 ]
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-09-14 14:08
やり方が間違ってます。IsInputKeyをオーバーライドするのは、コントロール側でありフォームではありません。これを使おうとするのであれば、既存のコントロールを継承したカスタムコントロールを作成する必要があります。

しかしこの方法だとカスタムコントロール作らなくちゃいけないので、ちと面倒です。

代案としては、フォーカスが移動する前に何らかの処理を行いたいのであれば、Validatingイベントを利用されてはどうでしょうか。このイベントはフォーカスが移動する直前に発生します。
またEnterは拾えるので、Enterで次のフィールドに進みたいのであれば、次のうちどれかのメソッドを呼び出せば実現できるかと。
SendKeys.Send("{TAB}")
ProcessTabKeyメソッド
SelectNextControlメソッド
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-09-14 15:38
みなさんいろいろありがとうございます。
まだ打ち合わせ中なので終わりしだいやってみます。

スキルアップ/キャリアアップ(JOB@IT)