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! Dieser Tipp wurde bereits 12.618 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 Neu! sevDTA 3.0 Pro SEPA mit Kontonummernprüfung Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |