DOBON.NET DOBON.NETプログラミング掲示板過去ログ

データグリッドビューのセル編集中に矢印キーでフォーカスを隣のセルに移動させたくない。

環境/言語:[OS : Windows 7 / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

2013/03/11(Mon) 13:12:44 編集(投稿者)
2013/03/11(Mon) 12:06:25 編集(投稿者)

【解決したい問題】

現在、VB2010でデータグリッドビューを活用した日誌ソフト(私用)作成中です
が、製造工程に携わったWinNT+VB2.0〜WinXP+VB6.0の時代の知識しかなく四苦八苦して
おります。

データグリッドビューの任意のセルを編集中、左向き矢印キーを押すとカーソルが1文
字ずつ左方に移動し、文字列の先頭に達した後は隣のセルにフォーカスが移ります。こ
れを、通常のテキストボックスでの動作と同様、カーソルを文字列先頭で留め置きたい
んです。そこで、http://dobon.net/vb/dotnet/datagridview/textboxevent.htmlのペー
ジを参考に、EditingControlShowingイベントハンドラで、セルの編集に使用されている
テキストボックスのKeyPressイベントハンドラを追加して矢印キーをキャンセル
(e.Handled = True)しようと考えましたが、KeyPressイベントは矢印キーでは発生せ
ず(当然ですね)。

気を取り直して、KeyDownイベントハンドラでキャンセル
(e.SuppressKeyPress = False)しようとしたのですが、カーソルが文字列の先頭以外
にある時はKeyDownイベントハンドラが呼ばれますが、カーソルが文字列の先頭に達した
状態で矢印キーを押してもKeyDownイベントハンドラは呼ばれず、フォーカスが隣のセル
に移ってしまいます。右向き矢印でも同様です。

私個人の希望としては、矢印キーを単独で押した場合は編集中セルの文字列内でのカー
ソル移動、セル間のフォーカス移動はコントロールキーを同時に押して実現したいと考
えています。

解決策をご存知の方、よろしくお願いします。
DataGridViewの編集モード中のコントロールが、入力されたキーをそのコントロール内で処理するかDataGridViewに処理を委譲する(セル間を移動したりだとか)かは、DataGridViewの編集用コントロールが実装する必要があるIDataGridViewEditingControlインターフェイスの、EditingControlWantsInputKeyプロパティによって判定されています。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.idatagridvieweditingcontrol.editingcontrolwantsinputkey.aspx
DataGridViewTextBoxColumn/DataGridViewTextBoxCellは、DataGridViewTextBoxEditingControlオブジェクトを編集用コントロールとしています。
DataGridViewTextBoxEditingControl.EditingControlWantsInputKeyはOverridableですので、DataGridViewTextBoxEditingControlクラスの派生クラスを作ってこのプロパティをOverridesすることで動作を変更させることが可能です。

例えばこちらなど参考になるでしょう。
http://dobon.net/vb/dotnet/datagridview/maskedtextboxcolumn.html
このリンク先では編集用コントロールとしてMaskedTextBox派生クラスを作成しているためにDataGridViewMaskedTextBoxEditingControlクラスの記述量が結構な物になっていますが、DataGridViewTextBoxEditingControlから派生するなら必要なコードは全てそちらが実装済みなので、記述するのはEditingControlWantsInputKeyだけです。
同様にDataGridViewTextBoxCell派生クラスで必要なのもEditTypeのOverridesだけ。
■No31392に返信(Hongliangさんの記事)

Hongliangさん、早速の返信ありがとうございます。
お教え頂いたページを覗いて見ましたが、Hongliangさんが仰る通り結構な記述量
に恐れをなしております。当方、冒頭でも述べましたように前世紀の知識しかな
く、経過の報告などで素早い対応ができるような気がしませんが、まずはお礼ま
で。
■No31393に返信(Iraquserさんの記事)
Hongliangさんのアドバイスに従い、乏しい知恵を総動員して取り組んだんです
が、カーソルがセル内の文字列先頭にある状態で左向き矢印キーを押すと、や
はりフォーカスが隣のセルに移ってしまいます。
何が悪いのか、何が足りないのか判らず、他の方法でも試していたところ、
http://dobon.net/vb/bbs/log3-42/25144.htmlを参考に矢印キーの動作を制御
する事ができました。
せっかくアドバイス頂いたのに、アドバイス通りの方法で解決に至らなかった
事、申し訳ありません。これからもよろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板