- - PR -
DataGridViewのセル移動、テキストボックス列内部 左端(右端)のKeyイベントについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2008-11-19 23:16
達成したいことをまとめ過ぎていて、何を行いたいのか
こちらに伝わってきません。 もう少し具体的に何をしたいのか説明した方が、書き込み があると思いますよ。 | ||||
|
投稿日時: 2008-11-20 09:53
カーソルキーによるセル移動を達成したいのか、抑制したいのか、読み取ることができません。(カーソルキーによるセル移動は標準動作なので抑制したいのかな?)
とりあえず、EditingControlWantsInputKey 置いておきますね。 | ||||
|
投稿日時: 2008-11-20 13:06
にーさん
未記入さん ありがとうございます。
おっしゃるとおり、最初記述したものより、 大幅に削減いたしました。 達成したい事項を列挙すると、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 ] | ||||
|
投稿日時: 2008-11-21 00:53
なるほど、そういう事でしたか。
結果的には解決したとの事で、なによりです。 また、こちらも色々と勉強させて頂きました。 ありがとうございました。 |
1