2008年2月25日月曜日

DataGridViewのTabStop対応(3)

前回の続きでTabStop制御について。
前回で「何をもってフォーカス可能と判断するか」というのを決めたので、次にやることへ。

  • 次にフォーカス可能なセルはどこか、を調査する

というのが次に行う処理。具体的には2方向に分かれることになる。

  • 現在のカレントセルより後ろに存在するセルでフォーカス可能か
  • 現在のカレントセルより前に存在するセルでフォーカス可能か

まぁこれは当たり前なところで、実際には「前か後ろか」の違いがあるだけ。やることは同じ。
そしてここで注意するのは「次ってどっち?」というところ。
画面の仕様にも関連するけれども、次というのが、「右方向」な場合と「下方向」な場合があるよね。
まぁこれはとりあえず右方向用メソッドと、下方向用メソッドで切り分けておいていいと思う。
後々リファクタリングの段階で、くっつけたりまぜたり分解したりしてしまえばいいかな、と。

''' <summary>同じ行の中で次にフォーカス可能なセルを取得する</summary>
Private Function GetAfterCellCanFocusInRow() As System.Windows.Forms.DataGridViewCell

  If Me.CurrentCell Is Nothing Then Return Nothing

  Dim checkResult As System.Windows.Forms.DataGridViewCell = Nothing
  Dim owningCellIndex As Integer = Me.CurrentRow.Cells.IndexOf(Me.CurrentCell)
  For Each gridCell As System.Windows.Forms.DataGridViewCell In Me.CurrentRow.Cells
    If Not Me.CheckFocusCell(gridCell) Then Continue For

    Dim targetCellIndex As Integer = Me.CurrentRow.Cells.IndexOf(gridCell)
    If owningCellIndex >= targetCellIndex Then Continue For
    checkResult = gridCell
    Exit For
  Next
  Return checkResult

End Function

やろうとするとこんな感じかな?これはサンプルとして「右方向」に走査するメソッドなので、コレを元にして下方向や左方向を操作するメソッドを用意してあげればいいと思う。そこまでできれば、後はProcess系メソッドのオーバーライドへといけるね。

0 件のコメント:

コメントを投稿