- PR -

DataGridViewのセル移動、テキストボックス列内部 左端(右端)のKeyイベントについて

1
投稿者投稿内容
108
常連さん
会議室デビュー日: 2007/12/12
投稿数: 45
投稿日時: 2008-11-19 11:30
お世話になります。

環境:VB2005 WindowsXP

・CDataGridViewクラス DataGridViewを継承
・MEISAI フォーム

MEISAIフォームにCDataGridView、
DataGridViewTextBoxColumnを複数列配置しています。

達成したいことは、

/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_
セル編集中における、
カーソルキー(←→)によるセル移動の制御
※ただし、セル内テキストボックスの文字列の左端or右端のみ
/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_

CDataGridViewクラスでは
(セル編集中)Enterキー押下時 右セルに移動
(セル編集中でない)Enterキー押下時 セル編集状態に
などの処理を記述。

MEISAIフォーム内では
DataGridViewに対し、CellEnterによるIME制御
一部列にKeyPressイベントAddHandlerにより、数値入力制御
他、CellClick、CellFormating、CellValidated、EndEditイベント
などでもごちゃごちゃやってます。

CDataGridViewクラスで
Protected Overrides Sub OnEditingControlShowing(ByVal e As DataGridViewEditingControlShowingEventArgs)
Dim editCtr As DataGridViewTextBoxEditingControl _
= TryCast(e.Control,DataGridViewTextBoxEditingControl)

このeditCtrにPreviewKeyDownイベントをAddHandlerすれば
MEISAIフォーム グリッド入力時
文字列の左端(右端)でe.KeyCode = Keys.Left(Keys.Right)
が押された事は取得できました。
※KeyDownイベントをAddHandlerした場合には、左端(右端)では
イベントさえ起こらない

PreviewKeyDown内ではキー操作を無効にすることはできないのでしょうか。
その後の処理もして欲しくないのですが、
この後フォーカスが隣のセルに移動してしまいます。
→MEISAIフォームEndEditが走る。
→MEISAIフォーム内KeyPressは走らない。

全セルに対する上記/_/_/_/内と、
KeyPressでの一部に対するIME、入力制御 
の両立ができそうになくて困っているのですが、
何か良い案、指摘などあればご教授願います。




[ メッセージ編集済み 編集者: 108 編集日時 2008-11-19 14:42 ]
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2008-11-19 23:16
達成したいことをまとめ過ぎていて、何を行いたいのか
こちらに伝わってきません。

もう少し具体的に何をしたいのか説明した方が、書き込み
があると思いますよ。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-11-20 09:53
カーソルキーによるセル移動を達成したいのか、抑制したいのか、読み取ることができません。(カーソルキーによるセル移動は標準動作なので抑制したいのかな?)

とりあえず、EditingControlWantsInputKey 置いておきますね。
108
常連さん
会議室デビュー日: 2007/12/12
投稿数: 45
投稿日時: 2008-11-20 13:06
にーさん
未記入さん
ありがとうございます。

引用:

にーさんの書き込み (2008-11-19 23:16) より:
達成したいことをまとめ過ぎていて、何を行いたいのか
こちらに伝わってきません。

もう少し具体的に何をしたいのか説明した方が、書き込み
があると思いますよ。



おっしゃるとおり、最初記述したものより、
大幅に削減いたしました。

達成したい事項を列挙すると、DataGridViewにおいて
1.(セル編集中でない)Enterキー押下時 セル編集状態に
2.(セル編集中)Enterキー押下時 右セルに移動
3.右隣のセルがReadOnlyの時はTab、エンターキーとも右セルに移動しない。
4.ReadOnlyセル(列全てでない。)クリック時は、
左列で直近のReadOnlyでないセルに移動。(左全てReadOnly時は、下列へ)
5.(セル編集中)入力フォーカスが文字列内にあるときは
  ←→キーでセル内フォーカス移動
  ※ "ABCDE" ←セル内文字列
   入力フォーカスが"A"の左、または"E"の右にあるとき、
   ←キー(→キー)入力により、左(右)セルに移動しない。
・・・
と他にもあるのですが今回は5.についてでした。

EditingControlWantsInputKeyについては知らなかったので、
これから検証してみます。

現状、単純に、
オーバーライドしたProcessDataGridViewKey内でやれば
実装できたっぽいので展開しておきます。

Protected Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean
    Try
      If e.KeyCode = Keys.Enter OrElse e.KeyCode = Keys.Tab Then
       If Me.Item(CurrentCell.ColumnIndex + 1, _ 
             CurrentCell.RowIndex).ReadOnly = True Then
          Me.EndEdit()
          e.Handled = True
       Else
        Return Me.ProcessTabKey(e.KeyCode)
       End If
      ElseIf Me.CurrentCell.IsInEditMode _
          AndAlso e.KeyCode = Keys.Right Then
        Dim TBEC As DataGridViewTextBoxEditingControl _
          = DirectCast(Me.EditingControl, _
          DataGridViewTextBoxEditingControl)
        '→キー
        If TBEC.SelectionStart = TBEC.Text.Length Then
          e.Handled = True
        End If
      ElseIf Me.CurrentCell.IsInEditMode _
         AndAlso e.KeyCode = Keys.Left Then
        Dim TBEC As DataGridViewTextBoxEditingControl _
            = DirectCast(Me.EditingControl, _
             DataGridViewTextBoxEditingControl)
        '←キー
        If TBEC.SelectionStart = 0 Then
          e.Handled = True
        End If
      Else
        Return MyBase.ProcessDataGridViewKey(e)
      End If

    Catch ex As Exception
      Me.EndEdit()
      e.Handled = True
    End Try
  End Function

Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
     'Enter,Tabキー時 隣がReadOnlyか判断
End Sub

Protected Sub Selection_Changed(ByVal sender As Object, _
              ByVal e As System.EventArgs) _
              Handles Me.SelectionChanged
   'ReadOnlyでないセルを取得しカレントセルに
End Sub



[ メッセージ編集済み 編集者: 108 編集日時 2008-11-20 13:44 ]
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2008-11-21 00:53
なるほど、そういう事でしたか。
結果的には解決したとの事で、なによりです。
また、こちらも色々と勉強させて頂きました。
ありがとうございました。
1

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