Datagridviewでreadonlyのセルはスキップしたい
質問
2008年8月11日月曜日 0:19
Datagridviewでデーター更新のプログラムを作成したく思っています。
Datagridviewには更新できる列と、表示のみのreadonlyの列とがあり、readonly列は色分けして入力できない旨ユーザーにはわかるようにしています。
Tabキー Enterキーでセルの移動時にreadonlyの列はスキップするようになれば使い良いものになると思いますがその方法がわかりません。
どうすればよいのかご教授の程よろしくお願いいたします。
すべての返信 (7)
2008年8月12日火曜日 3:01 ✅回答済み
DataGridViewをどこまでカスタマイズされているのかわかりませんので、とりあえずタブキーでReadOnlyの列をスキップさせるパターンです。基本的な考え方のみ実装していますので、細かいエラーなどの制御は考慮していません。
一度コンパイル後、DataGridViewの「列の編集ダイアログ」で、ReadOnlyな列の一つ前の列に以下のmyDataGRidViewTExtBoxColumnを選択して指定して下さい。
Code Snippet
' Column
Public Class myDataGridViewTextBoxColumn
Inherits DataGridViewTextBoxColumn
Public Sub New()
MyBase.CellTemplate = New myDataGridViewTextBoxCell()
End Sub
End Class
' Cell
Public Class myDataGridViewTextBoxCell
Inherits DataGridViewTextBoxCell
Protected Overrides Sub OnKeyDown(ByVal e As KeyEventArgs, ByVal rowIndex As Integer)
Dim grid As DataGridView = Me.DataGridView
If e.KeyCode = Keys.Tab Then
If grid(grid.CurrentCell.ColumnIndex + 1, grid.CurrentCell.RowIndex).ReadOnly = True Then
grid.CurrentCell = grid(grid.CurrentCell.ColumnIndex + 2, grid.CurrentCell.RowIndex)
e.Handled = True
End If
End If
End Sub
End Class
2008年8月20日水曜日 2:02 ✅回答済み
1.に関しては、If e.KeyCode = (Keys.Enter And e.Shift) Then で判断すれば良さそうです。
2.に関してはENTERキーで右方向へ移動ということでしょうか? であれば以下が参考になると思います。
DataGridViewのセル移動方法
http://www.microsoft.com/japan/msdn/community/gdn/ShowPost-37120.htm
2008年8月12日火曜日 4:46
ありがとうございます。
不勉強で申し訳ないのですが、どのように使用すればよいのかご教示頂けないでしょうか。
よろしくお願いいたします。
2008年8月12日火曜日 4:55
私が示したコードをDataGridViewがあるフォームのコード(何とか.vb)の一番下に貼り付けて下さい。その後一度コンパイルします。コンパイルできたら、デザイン画面でDataGridViewの右上にある小さな三角ボタンを押して列の編集を選び、ReadOnlyな列の一つ手前の列のColumnTypeをmyDataGridViewTextBoxColumnにします。
2008年8月12日火曜日 5:48
ありがとうございます。
早速実行してみたところ、スキップする事ができました。
基本的な考え方は理解する事ができました。あとはReadonly列が続く場合,最後の列の入力後、次の行に行く場合等、セルを順番に移動するコーディングが必要と思われるのでループしながらスキップさせるよう検討してみたいと思います。
課題として、
1列目がReadonlyの列の時、Datagridviewにfocusされた時、カーソルがスキップされないので、どのようにコントロールしたら良いのか、又は、KeyDown時に次のセルがReadonlyなのかどうか判断するのではなくて、セルにFocusされた時に、判断する方法はないのかということですが、良い方法があれば宜しくお願いいたします。
2008年8月19日火曜日 5:10
色々試行錯誤していく中で以下のように作成し試してみました。
Imports System
Imports System.Windows.Forms
Public Class myDataGridView
Inherits DataGridView
Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
If (keyData AndAlso Keys.KeyCode) = Keys.Tab OrElse (keyData AndAlso Keys.KeyCode) = Keys.Enter Then
'***現在の行
Dim col As Integer = Me.CurrentCell.ColumnIndex + 1
While col < Me.Columns.Count
If Not Me.Columns(col).ReadOnly Then '****入力可能ならば
Exit While
End If
col = col + 1
End While
'****
If col < Me.Columns.Count Then
'***現在の行
Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex).Cells(col)
Else
'***次行
If Me.CurrentCell.RowIndex <> Me.Rows.Count - 1 Then
For col = 0 To Me.Columns.Count - 1
If Not Me.Columns(col).ReadOnly Then
Exit For
End If
Next
Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex + 1).Cells(col)
End If
End If
Return True
End If
Return MyBase.ProcessDialogKey(keyData)
End Function
Protected Overrides Function ProcessDataGridViewKey(ByVal e As KeyEventArgs) As Boolean
If e.KeyData = Keys.Tab OrElse e.KeyData = Keys.Enter Then
Dim col As Integer = Me.CurrentCell.ColumnIndex + 1
While col < Me.Columns.Count
If Not Me.Columns(col).ReadOnly Then
Exit While
End If
col = col + 1
End While
If col < Me.Columns.Count Then
Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex).Cells(col)
Else
If Me.CurrentCell.RowIndex <> Me.Rows.Count - 1 Then
For col = 0 To Me.Columns.Count - 1
If Not Me.Columns(col).ReadOnly Then
Exit For
End If
Next
Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex + 1).Cells(col)
End If
End If
Return True
End If
Return MyBase.ProcessDataGridViewKey(e)
End Function
End Class
以上で、TABキーとENTERキーで次のReadonly以外のセルに移動するようにはなりましたが、少し問題があります。
1.shift+TABで、Readonlyのセルにも移動する。
2.新規行の追加を許可する場合、新規の追加された行で、入力後にENTERキーで次の行を追加し次の行に移ってしまう。(TABキーの時は同じ行の次の入力可能セルに移る)
これを解決すれば、使えるかなという気がしますが、上記の解決方法がよくわかりません。
どうか皆様、よろしくお願いします。
2008年9月4日木曜日 6:02
こんにちは。中川俊輔 です。
trapemiyaさん、回答ありがとうございます。
さくらさん、フォーラムのご利用ありがとうございます。
有用な情報と思われたため、trapemiyaさんの回答へ回答済みチェックをつけさせていただきました。
追加の質問等ありましたら、是非投稿してみてください!
回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。
さくらさんはチェックを解除することもできますので、ご確認ください。
それでは!