Rubrik: Controls · DataGrid & DataGridView | VB-Versionen: VB2005, VB2008 | 25.06.09 |
ReadOnly-Zellen im DataGridView überspringen II Mittels einer Subklasse wird das Datagridview mit der Funktion ergänzt, dass bei Navigation in einer Zeile des Datagridview mit der TAB-Taste die ReadOnly-Zellen gewissermaßen übersprungen werden. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 12.627 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Diesen Tipp habe ich im Internet in C# geschrieben gefunden, habe den Code in VB und auch den Text des Threads ins Deutsche übersetzt:
Damit bei der Navigation mittels TAB-Taste in einem DatagridView die readonly-Zellen bei der übersprungen werden können, kann man eine neue Klasse zum DGV ableiten und die Methoden ProcessDialogKey und ProcessDataGridViewKey überschreiben.
Wenn die aktuelle Zelle eines DGV im Edit-Mode ist und der User drückt eine Taste, wird die override ProcessDialogKey Methode aufgerufen. Wenn die aktuelle Zelle nicht im Edit-Mode ist und der User drückt eine Taste wird die override ProcessDataGridViewKey Methode aufgerufen. So gleichen sich beide Methoden gegenseitig aus.
In den override ProcessDialogKey und ProcessDataGridViewKey Methoden wird die nächste editierbare Zelle gesucht und wenn gefunden wird sie als aktuelle Zelle gesetzt.
Und hier der Code für die Subklasse:
Imports System Imports System.Collections.Generic Imports System.Text Imports System.Windows.Forms Public Class specialGridView Inherits DataGridView
Protected Overloads Overrides Function ProcessDialogKey( _ ByVal keyData As Keys) As Boolean Dim key As Keys = (keyData And Keys.KeyCode) If key = Keys.Tab 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 += 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.CurrentCell.ColumnIndex If Not Me.Columns(col).[ReadOnly] Then Exit For End If Next If col <= Me.CurrentCell.ColumnIndex Then Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex + 1).Cells(col) End If End If End If Return True End If Return MyBase.ProcessDialogKey(keyData) End Function
Protected Overloads Overrides Function ProcessDataGridViewKey( _ ByVal e As KeyEventArgs) As Boolean If e.KeyData = Keys.Tab 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 += 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.CurrentCell.ColumnIndex If Not Me.Columns(col).[ReadOnly] Then Exit For End If Next If col <= Me.CurrentCell.ColumnIndex Then Me.CurrentCell = Me.Rows(Me.CurrentCell.RowIndex + 1).Cells(col) End If End If End If Return True End If Return MyBase.ProcessDataGridViewKey(e) End Function
End Class
Ich finde dies eine recht praktikable Lösung!