- PR -

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

投稿者投稿内容
One.net
大ベテラン
会議室デビュー日: 2008/03/01
投稿数: 202
投稿日時: 2008-08-18 07:52
スレッド主です。
Toshiさん、とーちゃんさんのご指導でDataGridViewの編集中のセルでEnterキーの
KeyDownイベントを捕捉する方法について理解できました。以下ご指導いただきまし
た内容に付きましてまとめさせていただきましたので報告し、お礼とさせてください。
※このコードをご使用になる場合は注釈部分を削除してお使い下さい。
※ If e.KeyCode = Keys.Enter Then〜End If 内の処理の冒頭にMe.Validate() が必要

コード:

'-----EditingControlShowingイベントハンドラ・・・
' DataGridViewのセルに数字や文字を入力始めると自動的にTextBoxを使用する編集モードに
' 切り替わるために、DataGridViewのキーイベントを捕捉するのではなく、このTextBoxの
' キーイベントを捕捉する必要があります。そしてこのTextBoxに切替表示された時に、
' EditingControlShowingイベントが発生します。このイベントハンドラで編集に使用して
' いるTextBoxを取得し、PreviewKeyDownイベントハンドラを追加します。(↓詳細)
' http://dobon.net/vb/dotnet/datagridview/textboxevent.html
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, _
ByVal e As DataGridViewEditingControlShowingEventArgs) _
Handles DataGridView.EditingControlShowing

'-----もしDataGridViewTextBoxEditingControlであれば・・・
If TypeOf e.Control Is DataGridViewTextBoxEditingControl Then

Dim dgv As DataGridView = CType(sender, DataGridView)
'----1) 編集のために表示されているテキストボックスコントロールを取得します。
Dim tb As DataGridViewTextBoxEditingControl = _
CType(e.Control, DataGridViewTextBoxEditingControl)

'----2) 同じイベントハンドラが同じテキストボックスのイベントに何回も追加され
' ないようにEditingControlShowingイベントハンドラでイベントハンドラを
' 削除します。(↓詳細)
' http://dobon.net/vb/bbs/log3-5/2589.html
RemoveHandler tb.PreviewKeyDown, AddressOf dataGridViewTextBox_PreviewKeyDown

'---3) もし、キーイベントを発生させたいDataGridViewの列であれば ・・・
' 指定した例( "Column1") は、DataGridViewの「列の編集」ダイアログで
’ 表示されているデザインのに設定されている名前(Name)を指定します。
’ 例→"DataGridViewTextBoxColumn8"
If dgv.CurrentCell.OwningColumn.Name = "Column1" Then

'---PreviewKeyDownイベントハンドラを追加します。
' KeyDownイベントでは EnterキーやTabキー、矢印キーを捕まえらないので
' PreviewKeyDownイベントを使用(↓詳細)
' http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp02_event.html
AddHandler tb.PreviewKeyDown, AddressOf dataGridViewTextBox_PreviewKeyDown
End If
End If
End Sub


'-----DataGridViewに表示されているテキストボックスのPreviewKeyDownイベントハンドラ
' 文末の「Handles DataGridView1.PreviewKeyDown」(イベント発生源)を記述すること
' によってDataGridViewが編集中でなくとも If e.KeyCode = Keys.Enter Then〜End If
' が動作してくれます。
Private Sub dataGridViewTextBox_PreviewKeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) _
Handles DataGridView1.PreviewKeyDown

'-----もし、Enterキーが押されたのであれば
If e.KeyCode = Keys.Enter Then
計算() '-----DataGridViewの縦横計算や集計計算のモジュールへ
End If
End Sub




同様な例で、セルに数字以外を入力できないようにするには
コード:

'---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.KeyPress, AddressOf dataGridViewTextBox_KeyPress
'-----キーイベントを発生させたい列であれば
If dgv.CurrentCell.OwningColumn.Name = "Column1" Then
'-----KeyPressイベントハンドラを追加
AddHandler tb.KeyPress, AddressOf dataGridViewTextBox_KeyPress
End If
End If
End Sub


'-----DataGridViewに表示されているテキストボックスのKeyPressイベントハンドラ
Private Sub dataGridViewTextBox_KeyPress(ByVal sender As Object, _
ByVal e As KeyPressEventArgs) Handles DataGridView1.KeyPress
If (e.KeyChar < "0"c Or e.KeyChar > "9"c) AndAlso e.KeyChar <> "." _
c AndAlso e.KeyChar <> vbBack Then
e.Handled = True '--数字しか入力できないようにする
End If
End Sub



以上がDataGridViewでKeyDownイベントをイベントを捕捉する方法をまとめましたが、
まだ以下のような課題があります。これら課題の対処方法などご指導下いただければ幸いです。

【課題1:Tabキーやマウス操作の対応】
数字の入力後にEnterキー操作ではなく、Tabキーやカーソルキー・マウスでの操作
によるカーソル移動した場合の処理(指定位置へのフォーカス移動や集計)は行われないこと

【課題2:Enterの既定動作を中断させる方法】
フォーカス移動先指定で次のように設定しても1つ下の行に移動されます。これはEnter
でフォーカスが1行下(DataGridView1(0, 1))に移動する既定の動作と思いますが、
これを止める対処方法
If e.KeyCode = Keys.Enter Then
DataGridView1.CurrentCell = DataGridView1(0, 0)
End If

【課題3:DataGridView1.BeginEdit(True)の動作】
DataGridView1.BeginEdit(True)で、選択モードを編集モードにできるが、不規則
(時間?)に選択モードに戻ってしまう等、詳細な動作を理解できていません。
以上

修正:EditingControlShowingイベントハンドラ部を修正しました。
修正:「セルに数字以外を入力できないようにする」を追加
修正:課題2を追加変更

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

[ メッセージ編集済み 編集者: One.net 編集日時 2008-08-18 09:22 ]

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

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