Hot News:

Unser Angebot:

  Foren auf CAD.de
  VBasic / vb.net / vbs / wsh
  VB.NET: KeyPreview unterbrechen / Tastaturpuffer leeren ??

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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.



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2678
Registriert: 06.11.2000

erstellt am: 13. Mrz. 2012 10:14    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von RSchulz an!   Senden Sie eine Private Message an RSchulz  Schreiben Sie einen Gästebucheintrag für RSchulz

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für KMassler 10 Unities + Antwort hilfreich

Hallo Klaus,
dann musst du die KeyUp-Methode auf die einzelnen Objekte und nicht auf die Mainform definieren, oder du fragst im Mainform ab, welches Objekt aktiv ist, bevor du etwas machst.

------------------
MFG
Rick Schulz

Nettiquette (CAD.de)  -  Was ist die Systeminfo?  -  Wie man Fragen richtig stellt.  -  Unities

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.



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

Beiträge: 2678
Registriert: 06.11.2000

erstellt am: 13. Mrz. 2012 11:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

 
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.



Sehen Sie sich das Profil von KMassler an!   Senden Sie eine Private Message an KMassler  Schreiben Sie einen Gästebucheintrag für KMassler

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2025 CAD.de | Impressum | Datenschutz