- PR -

DataGridでのTabキー押下処理について

1
投稿者投稿内容
masima
会議室デビュー日: 2003/08/05
投稿数: 7
投稿日時: 2003-08-07 22:21
お世話になります。
現在DataGridを使用しており、以下のような処理をしようとしています。

DataGridのセルでTabキーを押下した場合、通常は左上〜右上〜左下〜右下と
フォーカスが移動し、右下のセルでTabキーを押すと次のコントロールに
フォーカスが移動します。

これをDataGrid上でTabキーを押下した場合、すぐに次のコントロールに
フォーカスを移動させることはできないでしょうか?
(VB6のFlexGridの動きを想定しています)

過去ログを検索し、DataGridTextBoxColumnオブジェクトのKeyDownイベントを
取得する方法を試してみました。
Dim t As DataGridTextBoxColumn
For Each t In DataGrid1.TableStyle(0).GridColumnStyles
AddHandler t.TextBox.KeyDown, AddressOf t_KeyDown
Next

Private Sub t_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
If e.KeyCode = Keys.Tab Then
Text1.Focus() '次のコントロールにフォーカスを移動
End If
End Sub

実行したところ、KeyDownイベントは発生したのですが、肝心のTabキーを押下した場合、
KetDownイベントが発生しません。
(文字キー、ファンクションキーは拾えますが、Tab、Enter、カーソルは拾えません)

よい対応策をご存知の方がいらっしゃいましたら是非教えて下さい。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-08 08:25
こんにちは。
引用:

masimaさんの書き込み (2003-08-07 22:21) より:
過去ログを検索し、DataGridTextBoxColumnオブジェクトのKeyDownイベントを
取得する方法を試してみました。


 全く見ていないので見当はずれならごめんなさい。DataGridTextBoxColumnではなく、DataGridのKeyDownイベントで拾うとか。

 Tab、カーソルキー、Enterと言うことなので、これらは非印字…テキストボックス内で文字として意味を持たないもですから、入ってこないのではないかと...
serious
常連さん
会議室デビュー日: 2001/08/22
投稿数: 31
投稿日時: 2003-08-08 09:38
e.KeyValue==(int)Keys.Tabでとれませんか?
masima
会議室デビュー日: 2003/08/05
投稿数: 7
投稿日時: 2003-08-11 22:16
遅くなりましたがJittaさん、seriousさん、ご回答ありがとうございます。

>Jittaさん
DataGridのKeyDownイベントを試してみましたが、Tab、Enterはおろか、
文字キー押下時もKeyDownイベントが発生しませんでした。

>seriousさん
e.KeyValueですが、どうもTab押下時はKeyDownイベントそのものが
発生しないようで、KeyDownイベントプロシージャが実行されません。

引き続き、いろいろ試してみようと思います。
masima
会議室デビュー日: 2003/08/05
投稿数: 7
投稿日時: 2003-08-12 14:59
お世話になっております。いろいろ試した結果、DataGridを継承した
クラスを作成し、ProcessCmdKeyメソッドをオーバーライドして、
ProcessCmdKey内でTabキー取得時、予め指定したコントロールの
Focusメソッドを実行する、という方法で実現できました。

コード:
Public Class MyDataGrid
    Inherits System.Windows.Forms.DataGrid
    Const WM_KEYDOWN As Integer = &H100
    Private mControl As Windows.Forms.Control

    Public Property NextControl() As Control
        Get
            Return mControl
        End Get
        Set(ByVal Value As Control)
            mControl = Value
        End Set
    End Property

    Protected Overrides Function ProcessCmdKey _
        (ByRef msg As System.Windows.Forms.Message, _
        ByVal keyData As System.Windows.Forms.Keys) As Boolean

        If msg.Msg = WM_KEYDOWN Then
            If (keyData = Keys.Tab) Then
                mControl.Focus()
                Return True
            Else
                Return MyBase.ProcessCmdKey(msg, keyData)
            End If
        End If
        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function
End Class



これからもよろしくお願いいたします。
1

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