Rubrik: Controls · DataGrid & DataGridView | VB-Versionen: VB2005, VB2008 | 05.12.08 |
Enter-Taste im DataGridView abfangen Ein abgeleitetes DataGridView-Control, das ein spezielles Ereignis auslöst, wenn die Enter-Taste gedrückt wurde mit der Möglichkeit die Aktion auch abzubrechen. | ||
Autor: Roland Wutzke | Bewertung: | Views: 20.836 |
www.vb-power.net | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
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:
Nachdem Sie das MyGrid-Klassenmodul erstellt haben, müssen Sie die Anwendung zunächst starten und anschließend beenden, damit das neue MyGrid-Control in der ToolBox der VB IDE angezeigt wird.
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