Haben Sie auch schon einmal versucht im DataGridView-Control gezielt auf das Drücken der Enter-Taste zu reagieren? Solange man sich nicht im Edit-Mode befindet, ist das auch kein Problem. Hier kann man die Enter-Taste bspw. im KeyDown-Event abfangen. Was aber wenn gerade eine Zelle editiert wird? In diesem Fall wird beim Drücken der Enter-Taste immer autom. in die darunterliegende Zelle gewechselt. Um dies zu verhindern bzw. um allgemein auf das Drücken der Enter-Taste reagieren zu können, erstellen wir einfach unser eigenes DataGridView-Control, indem wir dieses in einer eigenen Klasse ableiten und die Klasse um ein CellEnterPress-Ereignis erweitern. Als Parameter übergeben wir dem neuen Ereignis den Zeilen- und Spaltenindex, sowie die Möglichkeit den Vorgang über die Cancel-Eigenschaft abbrechen zu können, d.h. die Enter-Taste soll in diesem Fall nicht vom Control verarbeitet werden. Fügen Sie Ihrem Projekt ein neues Klassenmodul namens MyGrid mit folgendem Code hinzu: ''' <summary> ''' Stellt ein abgeleitetes DataGridView zur Verfügung, das ''' ein Event feuert, wenn die Enter-Taste betätigt wurde. ''' </summary> Public Class MyGrid ' von DataGridView erben Inherits Windows.Forms.DataGridView ' Merker für letzte Zeile und letzte Spalte ' diese Variablen werden als Parameter nach Außen weitergegeben Private m_LastRowIndex As Integer = -1 Private m_LastColumnIndex As Integer = -1 ' EventArgs für unser CellEnterPress-Event Public Class EnterCellEventArgs Inherits EventArgs Private m_Cancel As Boolean = False Private m_RowIndex As Integer = -1 Private m_ColumnIndex As Integer = -1 Public Sub New(ByVal RowIndex As Integer, ByVal ColumnIndex As Integer) m_RowIndex = RowIndex m_ColumnIndex = ColumnIndex End Sub ''' <summary> ''' Zeilenindex der Zelle, für die das Ereignis eintritt ''' </summary> Public ReadOnly Property RowIndex() As Integer Get Return m_RowIndex End Get End Property ''' <summary> ''' Spaltenindex der Zelle, für die das Ereignis eintritt ''' </summary> Public ReadOnly Property ColumnIndex() As Integer Get Return m_ColumnIndex End Get End Property ''' <summary> ''' Setzen Sie Cancel auf den Wert True, wenn die Enter-Taste ''' nicht vom DataGridView-Control verarbeitet werden soll. ''' </summary> Public Property Cancel() As Boolean Get Return m_Cancel End Get Set(ByVal value As Boolean) m_Cancel = value End Set End Property End Class ''' <summary> ''' Tritt ein, wenn in einer Zelle die Enter-Taste gedrückt wird ''' </summary> <System.ComponentModel.Description("Tritt ein, wenn in einer Zelle die" & _ "Enter-Taste gedrückt wird")> _ Public Event CellEnterPress(ByVal sender As Object, ByVal e As EnterCellEventArgs) ' OnCellEnter überschreiben und die ' aktuelle Position (Zeile, Spalte) merken Protected Overrides Sub OnCellEnter(ByVal e As _ System.Windows.Forms.DataGridViewCellEventArgs) m_LastColumnIndex = e.ColumnIndex m_LastRowIndex = e.RowIndex MyBase.OnCellEnter(e) End Sub ' ProcessCmdKey überschreiben und gezielt die Enter-Taste abfragen, ' damit das neue Event CellEnterPress ausgelöst werden kann Protected Overrides Function ProcessCmdKey( _ ByRef msg As System.Windows.Forms.Message, _ ByVal keyData As System.Windows.Forms.Keys) As Boolean If (keyData = Keys.Enter) Then ' wurde die Entertaste gedrückt soll das CellEnterPress- ' Event mit der Zeile und Spalte als Parameter ausgelöst werden Dim e As New EnterCellEventArgs(m_LastRowIndex, m_LastColumnIndex) RaiseEvent CellEnterPress(Me, e) ' Wenn Cancel=True, Entertaste nicht verarbeiten! If e.Cancel Then Return True End If Return MyBase.ProcessCmdKey(msg, keyData) End Function End Class Ab sofort verwenden wir dann nicht mehr das DataGridView-Control aus der Toolbox, sondern unser eigenes DataGridView, das Sie unter dem Namen MyGrid in der Toolbox finden. Hinweis: Um nun die Enter-Taste abzufangen und die Aktion ggf. abzubrechen folgenden Code verwenden: Private Sub MyGrid1_CellEnterPress(ByVal sender As Object, _ ByVal e As MyGrid.EnterCellEventArgs) Handles MyGrid1.CellEnterPress ' Enter wurde gedrückt! ' Frage, ob Aktion ausgeführt werden soll oder nicht If MsgBox("Die Entertaste wurde gedrückt!" & vbCrLf & _ "Zeile " & e.RowIndex + 1 & ", Spalte " & e.ColumnIndex + 1 & _ vbCrLf & vbCrLf & "Enter-Taste ausführen?", _ MsgBoxStyle.Question Or MsgBoxStyle.YesNo) = MsgBoxResult.No Then e.Cancel = True End If End Sub Dieser Tipp wurde bereits 20.837 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 sevAniGif (VB/VBA) Anzeigen von animierten GIF-Dateien Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. |
||||||||||||||||
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. |