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

DataGirdとTab

  • 題名: DataGirdとTab
  • 著者: VBBoy
  • 日時: 2004/02/24 19:04:18
  • ID: 2664
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB]
分類:[.NET]

.netのDatagirdにおけるTabKeyを無効にする方法

Datagird.Readonly = Trueでは、フォーカスは他から飛んできませんが
グリッド内のセルを選択した後にTabKeyを押すと隣のセルに移るだけです

希望としては、TabIndex順に次のテキストやラベルにフォーカスが
飛んでほしいのですが、ご存じの方いませんか?
こんばんわ。

データグリッドを継承したクラスを作成し、
その中で、(タブ)キー押下の処理を書けば実現できます。
ちなみに、クラス内のキー押下の処理は以下のような感じです。
※前と次のフォーカスの行き先はプロパティで持つようにしてます。

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

'' Tabキー押下
If (keyData = Keys.Tab) Then
Me.NextControl.Focus()
Return True

'' Shift + Tabキー押下
ElseIf (keyData = Keys.Tab + Keys.Shift) Then
Me.PrevControl.Focus()
Return True

Else
Return MyBase.ProcessCmdKey(msg, keyData)
End If
End If

Return MyBase.ProcessCmdKey(msg, keyData)

End Function

他にもっと良い方法があるのかも知れません。
■No2666に返信(SHさんの記事)

返信ありがとうございます

実は
1.ユーザコントロールの上にグリッドを単純に貼りつけて
  共通DLLに格納したものを
2.別プロジェクトにてそのDLLを参照設定し、
  フォームに貼りつけています
3.ProcessCmdKeyイベントは、1のユーザコントロールに記述しています
4.実行時、確かにProcessCmdKeyイベントは発生します

ただし、NextControlプロパティやPrevControlプロパティを指定したくありません
なぜなら、コーディングを横着したい(フォームに書きたくない)わけで
ユーザコントロール内で解決したいからです
グリッドのGetNextControlでは、グリッド下部のスクロールバーに飛んでしまいます

何かこれは!という方法はないでしょうか?
こんばんわ。

確認したわけではないのですが、GetNextControlって、
TabIndexを前方or後方検索かけてるんじゃないですかね??

だとすると、Formのデザイン時にTabIndexを意識すれば解決できるのでは?

もし違う場合は、自分でTabIndexを検索するような関数を作るとか・・・

ちなみに・・・・
> ただし、NextControlプロパティやPrevControlプロパティを指定したくありません
これは、プロパティウインドウで指定できるので、
コーディングはしなくてもいいと思います。

何かしらの方法で次の行き先は決めないと、
実装できないんじゃないかと思います。
VBBoyさん、SHさん、こんばんは。横槍失礼します。
 以前カスタムコントロールを作成した際にフォーカス移動処理を盛り込んだことが
ありましたので参考までに。

>> グリッドのGetNextControlでは、グリッド下部のスクロールバーに飛んでしまいます
とのことですけど、

    Me.GetNextControl(DataGrid1, True).Focus()

のようにされていたのでしょうか?
 GetNextControl メソッドは子コントロールのタブオーダを検索しますので、自身の次の
コントロールを取得することはできません。それを取得するには親に判断させる必要が
あるわけです。

 ですので、 Parent ( TopLevelControl の方が都合の良いケースもあるでしょうか)の
GetNextControl を呼んでやれば期待するような動きになるかと思います。

    Me.Parent.GetNextControl(Me, True).Focus()

 こんな感じでどうでしょうか?

# 因みにフォーカス移動だけが目的なのでしたら、 GetNextControl よりも SelectNextControl
# メソッドの方が便利です。 GetNextControl メソッドでコントロールを取得した場合、
# そのコントロールの Enabled や Visible プロパティが False のときには更に次の
# コントロールを取得しにいく必要がありますから。
# (そのコントロールにはフォーカスを移せないので)


> 何かしらの方法で次の行き先は決めないと、
> 実装できないんじゃないかと思います。
 そうですね。上記の方法でも(外だしの情報が何もないと)コンテナを使用したときに
不都合が生じることがあったりしますから(^_^;)
 スマートにやる方法があれば、私も是非知りたいです。
  • 題名: Re[5]: DataGirdとTab
  • 著者: VBBoy
  • 日時: 2004/02/26 8:40:29
  • ID: 2685
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
いろいろご意見ありがとうございました

私の場合、グリッドをグループの中にデザインしていましたので

Me.TopLevelControl.SelectNextControl(Me, True, True, True, True)

で、思惑通り、tabindex順の次のコントロールにフォーカスが移りました

今後もよろしくお願いします
解決済み!

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