vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Controls · DataGrid & DataGridView   |   VB-Versionen: VB2005, VB200805.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 WutzkeBewertung:  Views:  20.836 
www.vb-power.netSystem:  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



Anzeige

Kauftipp Unser Dauerbrenner!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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


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.