| |  | Online-Kurs: Grundlagen des 3D-Druck-Designs für Industrieingenieure , ein Kurs
|
Autor
|
Thema: VB.NET: KeyPreview unterbrechen / Tastaturpuffer leeren ?? (4430 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 13. Mrz. 2012 10:14 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, ich habe mal wieder ein (hoffentlich kleines) Problem: Ich habe eine Form "Mainform" als Startform mit diversen selbstgestrickten Buttons. Um auf die Enter- und Escape-Taste etc. zu reagieren, habe ich die Eigenschaft "KeyPReview" auf True gesetzt, die Tastatureingaben werden in der Sub "Mainform_KeyUp(..." ausgewertet: Code: Private Sub Mainform_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp ' ... Select Case e.KeyCode.ToString Case "F1" ' ... Case "F5" myBtnReRead_Click(Me, e) Case "Return" myBtnOk_Click(Me, e) Case "Back" ' ... Case "Escape" myBtnExit_Click(Me, e) Case Else 'Keine Aktion End Select ' ... End Sub
Das funktioniert erst mal problemlos. Ich habe in dieser Form u.A. eine DataGridView "DGV". Beim Editieren der Felder dieser DGV sollten die MainForm allerdings nicht auf die Tasten wie Enter, Esc. etc. reagieren, sondern nur das normale Verhalten der DGV aktiv sein. Und genau das schaffe ich nicht. Ich habe versucht, im Event BeginEdit die Eigenschaft KeyPreview zu deaktivieren und bei EndEdit wieder zu aktivieren, das bringt aber nichts, da der Tastendruck offenbar an die Mainform weitergegeben wird, auch wennn KeyPreview false ist.
Code: Private Sub DGV_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DGV.CellBeginEdit ' ... KeyPreview = False ' ... End Sub Private Sub DGV_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellEndEdit ' ... KeyPreview = True ' ... End Sub
Alternativ habe ich es mit einer Kontrollvariablen "EditMode" vesucht, die ich bei BeginEdit auf True und bei EndEdit auf false gesetzt habe, und dann in KeyUp die Auswertung nur bei Editmode=False durchgeführt habe. Hat auch nicht funktioniert, zu dem Zeitpunkt war Editmode immer false. Ich denke, ich muss in DGV_CellEndEdit den Tastaturpuffer leeren, bevor ich KeyPreview wieder aktiviere. Die Frage ist nur "Wie?" ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
RSchulz Ehrenmitglied V.I.P. h.c. Head of CAD, Content & Collaboration / IT-Manager

 Beiträge: 5541 Registriert: 12.04.2007 @Work Lenovo P510 Xeon E5-1630v4 64GB DDR4 Quadro P2000 256GB PCIe SSD 512GB SSD SmarTeam V5-6 R2016 Sp04 CATIA V5-6 R2016 Sp05 E3.Series V2019 Altium Designer/Concord 19 Win 10 Pro x64
|
erstellt am: 13. Mrz. 2012 10:35 <-- editieren / zitieren --> Unities abgeben:          Nur für KMassler
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000
|
erstellt am: 13. Mrz. 2012 11:06 <-- editieren / zitieren --> Unities abgeben:         
Zitat: Original erstellt von RSchulz: Hallo Klaus, dann musst du die KeyUp-Methode auf die einzelnen Objekte und nicht auf die Mainform definieren, ....
?? Dann müsste ich für jedes Objekt eine KeyUp-Methode definieren? *kopfkratz* Zitat: Original erstellt von RSchulz: ... oder du fragst im Mainform ab, welches Objekt aktiv ist, bevor du etwas machst.
Wie mache ich das? Und wie kann ich unterscheiden, ob die DGV-Zelle nur ausgewählt ist oder im Editiermodus ist? Die Standard-Aktion, die in der Mainform_KeyUp-Methode definiert ist, soll ja nur inaktiv sein, solange ein Feld editiert wird. [Edit] Ich habs gerade mal probiert, eine DGV_KeyUp-Methode hinzugefügt und per Debug.print protokolliert. Ergebnis: Das Mainform_Keyup kommt VOR dem DGV_KeyUp(!!). [/Edit] ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim [Diese Nachricht wurde von KMassler am 13. Mrz. 2012 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles... i.R.

 Beiträge: 2678 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ privat: ab 2024 Onshape seit 2025 SolidWorks for Makers
|
erstellt am: 13. Mrz. 2012 13:30 <-- editieren / zitieren --> Unities abgeben:         
Ausgehend von deinem Tipp: in CellBeginEdit wird KeyPreview auf false gesetzt. in CellEndedit bleibt das so... Es gibt eine neue sub DGV_KeyUp, wo bei Tastendruck Enter, Esc und Tab das KeyPreview wieder auf true gesetzt wird. Der TastenPuffer ist dann schon geleert und nichts passiert mehr in Mainform_KeyUp Code: Private Sub DGV_CellBeginEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DGV.CellBeginEdit ' ... KeyPreview = False ' ... End Sub Private Sub DGV_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DGV.CellEndEdit ' ... ' KeyPreview = True ' ... End Sub '... Private Sub DGV_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles DGV.KeyUp Debug.Print("DGV_KEYUP: " & e.KeyCode.ToString & " / KeyPreview= " & KeyPreview.ToString) Select Case e.KeyCode.ToString Case "Return" KeyPreview = True Case "Tab" KeyPreview = True Case "Back" Case "Escape" KeyPreview = True Case Else 'Keine Aktion End Select ' ... End Sub
Damit funktioniert das soweit, die Mainform wertet die Tastendrücke erst nach Beenden des Editierens wieder aus. Zusätzlich noch eine Zeile in DGV_CellMouseClick, damit auch KEyPreview auch richtig gestellt wird, wenn die Zelle mit der Maus verlassen wird: Code: Private Sub DGV_CellMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DGV.CellMouseClick ' ... ' Wenn die editierte Zelle mit der Maus verlassen wird, ' dann ist CurrentCell nicht mehr die editierte Zelle If Not DGV.IsCurrentCellInEditMode Then KeyPreview = True '... End Sub
Thx ------------------ Klaus www.al-ko.com | mein Gästebuch | privat... | Nasenheim Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |