- PR -

C# ToolStripContainer上のコントロールで、[Enter]キーでのフォーカス移動がしたいのですが

投稿者投稿内容
kuwappi
会議室デビュー日: 2004/10/14
投稿数: 10
お住まい・勤務地: Yokohama
投稿日時: 2006-06-30 13:11
じゃんぬねっとさん回答ありがとうございます。

教えて頂いたコードで実行したところ、
ダイアログが表示されました。

ですが、keyDataの値をウォッチしたところ、
「LButton | MButton | Back」でした。

調べたところ、LButton とか MButton はマウス関連のもののようですね。

ただ、
if ((keyData & Keys.Enter) == Keys.Enter)
という部分で「真」となっているので
問題なく[Enter]キーの押下は認識されていると思います。

VBA的に見ると、理解しがたいコードではありますが…

左辺と右辺に同じkeys.Enterがあり、しかも左辺には
keyDataがあるので、同じにはならないのではという気もするのですが、
そういったものなのでしょう。

あっ、もしかしたらデバッガの使い方が間違っているのかもしれないです。

「ローカル」というウィンドウで見ていたのですが、
今、自動変数というウィンドウから見てみたところ、

Keys.EnterとKeyDataの両方の値が、
「LButton | MButton | Back」となっていました。
たつ64
会議室デビュー日: 2005/08/02
投稿数: 16
お住まい・勤務地: 天下の台所?
投稿日時: 2006-06-30 15:42
ToolStripContainer 内にフォーカスがあるときは
this.ActiveControl に ToolStripContainer が返されるみたい。
Panel とか GroupBox とかのコンテナと違う動作ですね。

で、Form_KeyDown 内の該当箇所を
コード:
bool forward = e.Modifiers != Keys.Shift;
if (this.ActiveControl is ToolStripContainer)
{
   bool b = toolStripContainer1.SelectNextControl
      (toolStripContainer1.ActiveControl, forward, true, true, false);
   if (!b)
   {
      this.SelectNextControl(this.ActiveControl, forward, true, true, true);
   }
}
else
{
   this.SelectNextControl(this.ActiveControl, forward, true, true, true);
}


で、動きました(かなり強引ですが…。)
# 汎用性がないなぁ。
kuwappi
会議室デビュー日: 2004/10/14
投稿数: 10
お住まい・勤務地: Yokohama
投稿日時: 2006-06-30 16:56
たつ64さん回答ありがとうございます。

提示していただいたコードで動作することを確認できました。

助かりました、ありがとうございました。

なるほど、toolStripContainerの場合は、
toolStripContainerなのか判断して、
SelectNextControlメソッドでフォーカスを移動ということですか〜。

toolStripContainerにはKeyDownイベントがあるので、
そちらで処理をするのかなと思っていました。
(toolStripContainerのkeyDownイベントはなんのためにあるのかがわからなくなってしまいましたが…)

マスタフォームなどには、
このtoolStripContainerが使えると結構便利だなと思いましたので、
質問を寄せさせていただきました。

今までアクセスしかいじったことがなかったのですが、
C#とかで作られた、フリーのソフトなどを見ていると、
用意されているコントロールが豊富なので始めてみようと思ったのですが、
今回の[Enter]キーの件がクリアできないのであれば、
またアクセスで作るというのもアリなのかなと考えていました。

「できる」ということがわかりましたので、
安心してこのコントロールの使用ができます。

ただ、コードや文法など、知識というよりも経験不足をものすごく感じています。
一つ一つのコードに「?」となってます。

自分の意思でコードが書けるようになるには、もう少し時間がかかりそうです…

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-30 18:24
解決されたようですが、ちょっとだけ。

引用:

kuwappiさんの書き込み (2006-06-30 13:11) より:

VBA的に見ると、理解しがたいコードではありますが…
左辺と右辺に同じkeys.Enterがあり、しかも左辺にはkeyDataがあるので、同じにはならないのではという気もするのですが、そういったものなのでしょう。


ただの論理積ですから、VB でも同様に置き換えることができます。

コード:

    If (keyData And Keys.Enter) = Keys.Enter Then
         MessageBox.Show("Enter が押された")
    End If


引用:

「ローカル」というウィンドウで見ていたのですが、
今、自動変数というウィンドウから見てみたところ、

Keys.EnterとKeyDataの両方の値が、
「LButton | MButton | Back」となっていました。


私の環境ですと 「Return」 と表示されています。
見ている瞬間の状態には依存しないと思いますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-30 19:16
脇道失礼。
引用:

kuwappiさんの書き込み(2006-06-30 10:35)より:

観察してみると、左手は例えば伝票入力であれば、
「書類に指を置いたり、めくったり」しているようです。


あ・・・
勘定系は関わったことないので、それは思いつきませんでした。
あと、私が左利きなので、書類に置く手は右が多く、[TAB]の方が押しやすい。。。
同じく、考えもしませんでした。


ありがとうございます。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-06-30 20:28
私も昔はエンターでフォーカス移動は気持ち悪いというか今風じゃないと思ってました。

しかし仕事で某保険会社に行ったときに初めて、テンキーの部分だけが独立したキーボード
を見ました。ほぼすべての人の端末にそれがつながってるんですね。
左手には紙を持ち右手ですばやく入力するんだろうなぁと思ったわけです。

よく考えたら自分も昔、データ入力のバイトしてたとき、時間あたりの処理件数が重要で、
左手には申込書の束、右手で(エンター移動の)高速入力してたのを思い出しましたね。
普通のキーボードでしたが、もしあれがTAB移動だったら面倒だったなぁ、と。
kuwappi
会議室デビュー日: 2004/10/14
投稿数: 10
お住まい・勤務地: Yokohama
投稿日時: 2006-07-01 21:50
じゃんぬねっとさん、回答ありがとうございます。

引用:

ただの論理積ですから、VB でも同様に置き換えることができます。



そうだったんですね、言語の違いではなく、
入力判定のためのものということなのですね。
キー入力判定についても勉強が必要なようです。

引用:

私の環境ですと 「Return」 と表示されています。
見ている瞬間の状態には依存しないと思いますが...



再インストールが必要なのかもしれません。
[Enter]キーを押しているのに、
マウスボタンの値となっていのすので…

丁寧に何度も教えて頂きありがとうございました。

このスレッドに関しては、
解決したような気もしますが、
toolStripContainerに用意されたKeyDownイベントは
いつ発生するのかという疑問があるので、
海外のサイトなんかも情報を漁ってみたいと思います。
kuwappi
会議室デビュー日: 2004/10/14
投稿数: 10
お住まい・勤務地: Yokohama
投稿日時: 2006-07-03 11:26
じゃんぬねっとさん。

引用:

私の環境ですと 「Return」 と表示されています。
見ている瞬間の状態には依存しないと思いますが...



ProcessCmdKeyメソッドでの、[Enter]キーの補足がうまくいっていなかった
原因がなんとなくわかりました。

再インストールしても解決しないため、
ふと、PCのキーボードが差し込まれているところを見たところ、
USBタイプのキーボードでした。

これが原因だと思われます。
たぶんですが…

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