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.777 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 März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. sevGraph (VB/VBA) Grafische Auswertungen Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! |
||||||||||||||||
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. |