vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
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:     [ Jetzt bewerten ]Views:  20.776 
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

Dieser Tipp wurde bereits 20.776 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel