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.830 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! sevCommand 4.0 Professionelle Schaltflächen im modernen Design! Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. |
||||||||||||||||
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. |