- 題名: DataGridViewTextBoxEditingControlのKeyDownイベント処理
- 日時: 2009/08/05 16:53:36
- ID: 25144
- この記事の返信元:
- (なし)
- この記事への返信:
- [25153] Re[1]: DataGridViewTextBoxEditingControlのKeyDownイベント処理2009/08/06 16:50:13
- ツリーを表示
私のPCで試したところ、
EditingControlWantsInputKeyと
ProcessDataGridViewKeyの組み合わせで
うまくいきました
# コードがVBですがご了承下さいm(_ _)m
Public Class Form2
Inherits Form
Dim _dgv As New DataGridViewEX
' 画面初期表示
Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
Me.Text = Me.GetType.Name
With Me._dgv
.AutoGenerateColumns = False
.Dock = DockStyle.Fill
Me._helperAddColumn("列1")
Me._helperAddColumn("列2")
Me._helperAddColumn("列3")
.DataSource = Me._helperCreateTable
End With
Me.Controls.Add(Me._dgv)
MyBase.OnLoad(e)
End Sub
' DataGridViewに列を追加する
Private Sub _helperAddColumn(ByVal name As String)
Dim col As New DataGridViewMyColumn
col.DataPropertyName = name
col.Name = name
col.HeaderText = name
Me._dgv.Columns.Add(col)
End Sub
' データソースを作成する
Private Function _helperCreateTable() As DataTable
Dim dt As New DataTable
dt.Columns.Add("列1", GetType(String))
dt.Columns.Add("列2", GetType(String))
dt.Columns.Add("列3", GetType(String))
For i As Integer = 0 To 10
dt.Rows.Add("データ1-" + i.ToString, "データ2-" + i.ToString, "データ3-" + i.ToString)
Next
Return dt
End Function
End Class
' 編集モードでないときにカーソルキーを無効化するDataGridView
Public Class DataGridViewEX
Inherits DataGridView
Protected Overrides Function ProcessDataGridViewKey(ByVal e As System.Windows.Forms.KeyEventArgs) As Boolean
Select Case e.KeyCode
Case Keys.Up, Keys.Down, Keys.Left, Keys.Right
' カーソルキーは無効化
Return True
Case Else
Return MyBase.ProcessDataGridViewKey(e)
End Select
End Function
End Class
' DataGridViewTextBoxCellを使うColumn
Public Class DataGridViewMyColumn
Inherits DataGridViewTextBoxColumn
Public Overrides Property CellTemplate() As System.Windows.Forms.DataGridViewCell
Get
Return New DataGridViewMyCell
End Get
Set(ByVal value As System.Windows.Forms.DataGridViewCell)
MyBase.CellTemplate = value
End Set
End Property
End Class
' DataGridViewMyEditingControlを使うセル
Public Class DataGridViewMyCell
Inherits DataGridViewTextBoxCell
Public Overrides ReadOnly Property EditType() As System.Type
Get
Return GetType(DataGridViewMyEditingControl)
End Get
End Property
End Class
' カーソルキーをDataGridViewに送らない編集コントロール
Public Class DataGridViewMyEditingControl
Inherits DataGridViewTextBoxEditingControl
Public Overrides Function EditingControlWantsInputKey(ByVal keyData As System.Windows.Forms.Keys, _
ByVal dataGridViewWantsInputKey As Boolean) As Boolean
Select Case keyData
Case Keys.Up, Keys.Down, Keys.Left, Keys.Right
' カーソルキーは編集コントロールが処理し、DataGridViewには送らない
Return True
Case Else
Return MyBase.EditingControlWantsInputKey(keyData, dataGridViewWantsInputKey)
End Select
End Function
End Class
H.K.R.さんに教えてもらった方法でやってみました。 ●方向キーなどは捕捉できるが、Enterキーが捕捉できない。 新しいDataGridViewTextBoxEditingControlの継承クラスを定義し、その中で 方向キー、PageUp、PageDown、Home、End、そしてEnterキーを要求しました。 継承クラスのKeyDownイベントでそれらのキーを捕捉できるようになったので すが、ひとつだけ、Enterキーが捕捉できません。 ?このテキストボックスのKeyDownイベントでEnterキーを捕捉することはでき ないでしょうか。
分類:[.NET]
【解決したい問題】 DataGridViewで編集を行うとき、DataGridViewTextBoxEditingControlのイベ ントで、Enter, Up, Down, Left, RightなどのKeyDownを補足しようと思って います。これらの方向キーを押したときの処理はプログラムで行い、通常の カーソル移動などの動作が発生するのを抑制したいと思っています。 しかし、このDataGridViewTextBoxEditingControlというテキストボックスで は、これらのキーではKeyDownイベントが発生しません。 【解決するために何をしたか】 http://dobon.net/vb/dotnet/control/btndetectarraykey.html を参考にして、 上記のコントロールに次のようなPreviewKeyDownイベントハンドラーを設定し ました。 private void tbox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch (e.KeyCode) { case Keys.Up: case Keys.Left: case Keys.Right: case Keys.Down: MessageBox.Show("Up, Down等のキー"); // テスト用 e.IsInputKey = true; break; } } MessageBoxの表示で、この段階の捕捉できていることは確認できました。これ で、Up、Leftキーなどにも普通のKeyDownイベントが発生するものと想像してい たのですが、そうはならず、普通のUpキーやLeftキーの動作をしてしまいます。 【追加事項】 DataGridViewTextBoxEditingControlで、方向キーなどを押したとき、その処理 をプログラムで行い、e.Handled = trueのような設定をして、通常のカーソル 移動などの動作が発生するのを抑制するにはどうしたら良いでしょうか。