- PR -

◆DataGridView でKeyDownイベントを捕捉したい。

投稿者投稿内容
とーちゃん
会議室デビュー日: 2008/07/08
投稿数: 11
投稿日時: 2008-08-14 07:52
発生場所1→RemoveHandler tb.KeyDown, AddressOf dataGridViewTextBox_KeyDown
発生場所2→AddHandler tb.KeyDown, AddressOf dataGridViewTextBox_KeyDown

こちらではエラーもなくいけてるので何とも言いようがないのですが、
エラー内容からすると、dataGridViewTextBox_KeyDownが無いよということなので、
Private Sub dataGridViewTextBox_KeyDown(byval〜) Handles DataGridView1.KeyDown

を作られてなかったりしますか?

Private Sub dataGridViewTextBox_KeyPress(byval〜) Handles DataGridView1.KeyPress

のままだったり・・・?検討違いでしたらすみません。

→「"e.KeyCode"は"System.Windows.Forms.KeyEventArgs"のメンバーではありません。」の方はちょっと見てみますね。

あ、一応、こちらの環境もWindowsXP VB2005EEです。

[ メッセージ編集済み 編集者: とーちゃん 編集日時 2008-08-14 07:56 ]
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-08-14 08:57
とーちゃんさん、すみません
私のDataGridViewフォームで色々とテストしていたので関係ないブロックを消しますと
エラーはなくなりました。すみませんでした。

ただ正常に動作しないので次のように書き換えて実行しましたし、該当セルに
"1" と"Enter"を押すと"1"の後にはメッセージが表示されますが"Enter"の後には
メッセージが表示されません。

コード:

Private Sub dataGridViewTextBox_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles dataGridView1TextBox.KeyDown
MessageBox.Show("正常にKeyDownを捕捉しました。")
End Sub


このことは"Enter"の捕捉が出来ていないのではないでしょうか?
よろしくお願いいたします。

[ メッセージ編集済み 編集者: One.net 編集日時 2008-08-14 09:01 ]
とーちゃん
会議室デビュー日: 2008/07/08
投稿数: 11
投稿日時: 2008-08-14 09:18
すみません。KeyDownのことばかり考えてました。
目的は"Enter"でしたね^^;

こちらは、Toshiさんの仰っているPreviewKeyDownを利用すると取得できます。

KeyDownをPreviewKeyDownに変え、
シグネチャをSystem.Windows.Forms.KeyDownEventArgsから
System.Windows.Forms.PreviewKeyDownEventArgsに変更しました。

コード:

'---EditingControlShowingイベントハンドラ
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView1.EditingControlShowing
'--このがDataGridViewTextBoxEditingControlであれば
If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then
Dim dgv As DataGridView = CType(sender, DataGridView)
'---編集のために表示されているコントロールを取得
Dim tb As DataGridViewTextBoxEditingControl = _
CType(e.Control, DataGridViewTextBoxEditingControl)
'------------イベントハンドラを削除
RemoveHandler tb.PreviewKeyDown, AddressOf dataGridViewTextBox_PreviewKeyDown
'-キーイベントを発生させたい列であれば
If dgv.CurrentCell.OwningColumn.Name = _
"DataGridViewTextBoxColumn8" Then
'---PreviewKeyDownイベントハンドラを追加
AddHandler tb.PreviewKeyDown, AddressOf dataGridViewTextBox_PreviewKeyDown
End If
End If
End Sub


'DataGridViewに表示されているテキストボックスのPreviewKeyDownイベントハンドラ
Private Sub dataGridViewTextBox_PreviewKeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles DataGridView1.PreviewKeyDown
Select Case e.KeyCode
Case Keys.Enter
計算() '---計算モジュールへ
End Select

End Sub



[追記]
KeyDownイベントで"Enter"が補足できないのは正常な動作なのではないかなと思います。

'// 私的なことで申し訳ないのですが、明日の晩までネット環境の無い場所に外出いたします。
'// 問題が発生した場合、すぐにフォローができないこと、お詫び申し上げます。



[ メッセージ編集済み 編集者: とーちゃん 編集日時 2008-08-14 09:30 ]
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-08-14 09:54
とーちゃんさん、ありがとうございました。

引用:

とーちゃんさんの書き込み (2008-08-14 09:18) より:
'// 私的なことで申し訳ないのですが、明日の晩までネット環境の無い場所に外出いたします。
'// 問題が発生した場合、すぐにフォローができないこと、お詫び申し上げます。



了解いたしました。
昨夜は深夜からお付き合いいただき、又今朝も早くからありがとうございました。
涼しい別荘にでもお出かけなのでしょうか。お出かけになる前に取りそぎ御礼申し
上げます。ありがとうございました。
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-08-14 10:28
こんにちわ

返信がおそくなりました。
読み返してみたら、Enterが捕捉できないことが趣旨じゃなかったですね・・はじめ・・
早とちりしました。すいません。

まず、EnterキーがKeyDownイベントで捕捉できないのは正常な動作です。
KeyDownイベントでは、特殊な動作をするキーの捕捉はできません。
たとえば、Tabキーや、Buttonの上にフォーカスがあるときのEnterキーなどです。

これは、それらのキーがほかの動作にわりあてられているためです。
(DataGridViewではEnterキーを押下すると、下方向にフォーカスが移動していきます。)
このようなキーの押下時を取得するためには、前述したPreviewKeyDownイベントを利用する必要があります。
→ それで、はじめにPreviewKeyDownじゃだめですか?と記載しました。

少し気になった点があります。
Enterキーで動作するとありますが、
Tabキーやカーソルキー・マウスでの操作時はどうなるのでしょうか?

このあたりも十分に詰めておいたほうがよいかと思います。

追記)
引用:

エラー内容→「名前"dataGridViewTextBox_KeyDown"は定義されていません」


とありましたが、このエラーの原因は理解されてますでしょうか?

質問内容をとおして思ったのですが、イベントの仕組等について、
もう少し理解を深めたほうがよろしいかと思います。

よねKENさんのHPで説明されていますので、一度熟読されることをお勧めします。
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp02_event.html

あと、
コード:
Private Sub dataGridViewTextBox_PreviewKeyDown(ByVal sender As Object, _
                ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles DataGridView1.PreviewKeyDown


とありますが、Handles以降が必要かも、検討してみてください。
(DataGridViewEditingControlのPreviewKeyDownイベントだけでなく、
DataGridViewのPreviewKeyDownイベントも必要ですか?)

この記載があることで、ちょっとした差ですが、Editを表示せずに
Enterキーを押下したときにも、計算の処理が走るようになります。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-08-14 11:27
とーちゃんさん
もうお出かけになったと思いますが、KeyDown をPreviewKeyDownに変更することで、
おかげさまで正常にDataGridView で編集中のセルでKeyDownイベントを捕捉し、
"Enter"キーを捉えることが出来ました。また"Enter"キーを捉えることでカーソル
移動も自由に指定できるのではと考え、テストしてみます。本当にありがとうござ
いました。

Toshiさん、先日はありがとうございました。
確かに「編集中のセルでKeyDownイベントの捕捉方法」でしたが、回りまわって
PreviewKeyDownイベントでないと捕らえられず、PreviewKeyDownイベントを使って
正常に動作するようになりました。
ところでご指摘いただいた「Tabキーやカーソルキー・マウスでの操作時はどうなる
のでしょうか? 」についてですが数字をインプットしてTabキーやマウスで次項目へ
移動させた場合のことでしょうか。もしそうなら全く対応していません。なるほど
問題ですね。
また、よねKENさんのHPを読みました。「1.Handles句」「2.senderとe」
「2.AddHandler」などはおまじないのようなものとして記述していました。

最後に大切なことをご指摘いただきました下記のことですが、意味を理解していません。
出来たらもう少し詳しくご指号下さい。
コード:

Handles以降が必要かも、検討してみてください。 (DataGridViewEditingControlの
PreviewKeyDownイベントだけでなく、DataGridViewのPreviewKeyDownイベントも
必要ですか?) この記載があることで、ちょっとした差ですが、Editを表示せずに
Enterキーを押下したときにも、計算の処理が走るようになります。







[ メッセージ編集済み 編集者: One.net 編集日時 2008-08-14 11:30 ]
Toshi
ベテラン
会議室デビュー日: 2007/09/18
投稿数: 68
お住まい・勤務地: 関東のどっか
投稿日時: 2008-08-14 17:02
こんにちわ、

Handles句とAddHanler について理解はなされましたでしょうか。
コード:
Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _
            ByVal e As KeyPressEventArgs) Handles DataGridView1.KeyPress



コード:
Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _
                                           ByVal e As KeyPressEventArgs)


の違いは把握されていますか?

今回、One.netさんが記載したコードでPreviewKeyDownの
イベント発生源のオブジェクト(sender)となりうるのは何でしょう?
どういったときに処理を行いたいのでしょう?

そのあたりを考えデバッグを行っていくと、
「Handles以降が必要かも、検討してみてください。 」
答えが見えてくると思います。
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-08-14 17:37
Toshiさん、ありがとうございます。
Handles DataGridView1.KeyPress を記述するればセルの「編集モード」だけではなく
「選択モード」でもdataGridViewTextBoxのKeyPressイベントを捕捉してくれるようですね。
まだ十分理解できていませんので、ご指摘いただいたサイトを中心にもう少し勉強します。

とーちゃんさんもこれら一連のコードに対して動作を理解するよう指導されました。
Toshiさんの指摘された件に関しても自分で検討し見つけますので、回答は結構です。
本当に色々ありがとうございました。

[ メッセージ編集済み 編集者: One.net 編集日時 2008-08-14 17:39 ]

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