次の方法で共有


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さんの回答へ回答済みチェックをつけさせていただきました。

追加の質問等ありましたら、是非投稿してみてください!

 

回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
有用な情報と思われる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

さくらさんはチェックを解除することもできますので、ご確認ください。

 

それでは!