Problem mit Keypress Event Routine

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Problem mit Keypress Event Routine

    Hi,

    Ich habe eineBookings_Keypress Routine im EditMode Event hinzugefügt .... und will nun den eingegebenen Wert verarbeiten:

    VB.NET-Quellcode

    1. Dim myKey As Char
    2. Public Sub Bookings_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
    3. If e.KeyChar = ":"c AndAlso AutofillCategory.Contains(":") Then e.Handled = True
    4. myKey = e.KeyChar
    5. End Sub
    6. Public Sub Bookings_TextChanged(ByVal sender As Object, ByVal e As EventArgs)
    7. If ControlDisabled Then Exit Sub
    8. If myKey = Keys.Delete Then Exit Sub
    9. If myKey = Keys.Back Then Exit Sub
    10. ...


    Die Abfrage auf ":"c funktioniert ohne Probleme ...

    Jedoch die Syntax myKey = Keys.Delete ist natürlich nicht richtig ... man kann nicht "Char" und "Keys" ohne weiteres vergleichen.

    Aber wie kann ich das beheben ? CChar ... oder DirectCast( ..., Keys) liefern andere Fehlermeldungen ...

    Kann mir jemand sagen, wie man diese Abfrage handhaben kann ?

    LG
    Peter
    ​e.KeyChar gibt ein ​Char zurück. Wenn du darauf prüfen willst, musst du das entsprechende Char in die Prüfung geben.
    Sprich:

    C#-Quellcode

    1. switch (myKey) {
    2. case '\b': //backspace
    3. break;
    4. case 'b': // kleines B
    5. break
    6. }


    Gib dir doch mal ​myKey aus und schaue, welcher Wert zurück kommt. Drücke einmal alle Tasten durch, die du brauchst und dann prüfst du darauf.
    learn.microsoft.com/en-us/dotn…s?view=windowsdesktop-7.0 Microsoft hat da gute Beispiele.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    @siycah in VB.NET. ;)
    @Peter329 Setze einen Haltepunkt rein und sieh Dir an, was ankommt, wenn Du welche Taste drückst.
    Nimm alternativ das KeyDown-Event.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    in VB.NET.


    VB.NET-Quellcode

    1. ​sub Foo()
    2. select case myKey
    3. case "\b"c ' backspace
    4. return
    5. case "b"c ' kleines b
    6. return
    7. end select
    8. end sub


    Ich hoffe dass ich die Syntax so richtig habe :D
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)
    So kommt es erst gar nicht zu TextChanged, und man muss nicht im TextChaged abwürgen.

    VB.NET-Quellcode

    1. Private Sub Bookings_KeyDown(sender As Object, e As KeyEventArgs) Handles Bookings.KeyDown
    2. If e.KeyCode = Keys.A Then
    3. e.SuppressKeyPress = True 'es kann kein a/A eingegeben werden.
    4. End If
    5. End Sub
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    siycah schrieb:

    VB.NET-Quellcode

    1. case "\b"c ' backspac
    Nö.
    Escape-Zeichen kommen in VB nicht vor, da ist ein vbChar-Item oder so erdforderlich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Escape-Zeichen kommen in VB nicht vor, da ist ein vbChar-Item oder so erdforderlich


    Stimmt. Hätte ja auch einfach vorhin schon ein Konverter nehmen können ;)
    Naja, wäre wahrscheinlich zu einfach gewesen. Ist aber auch kompliziert gemacht...

    VB.NET-Quellcode

    1. Public Sub Foo()
    2. Select Case myKey
    3. Case vbBack
    4. Case "b"c
    5. End Select
    6. End Sub


    So ist's aber richtig.
    Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

    Meine Firma: Procyon Systems
    Meine Privatwebseite: SimonC.eu

    Bitte nicht wundern, wenn meine Aktivitäten im Forum etwas langsamer sind, ich baue gerade mein Nebengewerbe zum Vollgewerbe aus.
    Ich versuche auf euch zurückzukommen :)

    siycah schrieb:

    So ist's aber richtig.
    Aller guten Dinge sind drei. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Peter329: Dann speicher und vergleiche doch Key aus KeyDown und KeyChar aus KeyPressed. KeyChar allein hilft Dir bei Spezialtasten nicht weiter.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Vielen Dank erst einmal für die vielen Ratschläge.

    Da einige wissen wollten, was ich hier treibe, kurz eine Beschreibung der Funktion:

    Ich nehme Bankdaten in einer Datagridview per Internet entgegen und will den Buchungen jeweils eine Kategorie:Subkategorie zuweisen.

    Die bisher verwendeten Kategorien habe ich mir "gemerkt" ... und beim Updaten der Dgv Zelle, soll ein AUTOFILL zum Tragen kommen ... d.h. wenn die eingegebenen Zeichen den Anfang einer bekannten Kategorie bilden, soll diese automatisch eingesetzt werden ... ein ":"c beendet die Kategorie ... und dann soll gleichermaßen mit der Subkategorie verfahren werden.

    Das spart enorm viel Schreibarbeit und ist deshalb für mich sehr nützlich. Im Anhang seht ihr, wie das mit dem "Autofill" funktioniert. Im ersten Bild habe ich "Last" eingetippt (dann war die Kategorie getroffen), dann ein ":" zum Abschließen der Kategorie und dann noch "S" ... dann war auch die Subkategorie getroffen.

    Das Ganze funktioniert auch schon ganz prima ... solange ich nur Zeichen eingebe. Anders ist das, wenn ich die "Backspace"-Taste oder die "Entfernen"-Taste drücke. Denn diese Tasten erfordern aufgrund meiner Anforderungen eine besondere Behandlung.

    Nach RFG's Rat, den Debugger zu verwenden und den anderen Ratschlägen, kann ich die BACKSPACE Taste jetzt richtig abhandeln:

    VB.NET-Quellcode

    1. If myKey = Microsoft.VisualBasic.vbBack Then Exit Sub


    Allerdings habe ich jetzt noch Probleme mit der "Entfernen"-Taste. Für diese Taste feuert das KeyPress-Event nämlich nicht !


    Muss ich hierfür das KeyDown-Event verwenden ?

    LG
    Peter
    Bilder
    • s 2023-02-24 15-16-123.jpg

      64,21 kB, 829×242, 28 mal angesehen
    • s 2023-02-24 15-16-163.jpg

      64,25 kB, 829×242, 34 mal angesehen
    • s 2023-02-24 15-16-233.jpg

      64,84 kB, 829×242, 33 mal angesehen
    Wie gemeint: ja. Hol es Dir zusätzlich aus dem KeyDown-EventHandler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Wie gemeint: ja. Hol es Dir zusätzlich aus dem KeyDown-EventHandler.


    Ok, ... jetzt habe ich es verstanden ... ich benötige noch das KeyDown Event, um Keys.Delete abfangen zu können. Die Routine muss ich wie für KeyPress mit AddHandler anhängen.

    Für alle, die es interessiert: Der Witz bei der Sache ist, dass KeyPress einen Char zurückliefert, während KeyDown Keys übergibt. KeyPress und KeyDown feuern unterschiedlich ... KeyChar und Keys sind nicht dasselbe und schon gar nicht konvertierbar. Ich glaube so einigermaßen habe ich das jetzt verstanden. :)

    Jetzt funktioniert mein Autofill ... ich bin begeistert.

    Recht herzlichen Dank an alle Ratgeber.

    LG
    Peter

    Peter329 schrieb:

    habe ich das jetzt verstanden.
    Nach meiner Meinung ist die KeyPress-Routine eigentlich nur relevant für das Auto-Repeat von Tasten.
    Arbeite mit KeyDown und ggf. KeyUp, KeyPress ist da nicht erforderlich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ²RFG: Danke für den Hinweis.

    Prinzipiell ist das schon richtig, mit KeyDown kann man jetzt eigentlich alle Fälle abfangen. Aber leider brauche ich das KeyPress Event doch:

    [vbnet
    Public Sub Bookings_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
    If e.KeyChar = ":"c AndAlso ... Then e.Handled = True
    End Sub
    ][/vbnet]

    Denn bei der Eingabe von ":" darf der markierte Text (Autofill Vorschlag) nicht gelöscht werden ! Das Dingens muss an den kompletten Inhalt der Textbox angehängt werden. Und das erreiche ich u.a. mit e.Handled = True im KeyPress Event. Außerdem muss verhindert werden, dass ein zweites ":" eingegeben wird. Die Sache ist also ziemlich tricky ...

    Trotzdem vielen Dank, dass du dich so eingehend mit meinem Problem befasst hast.

    Alles in Allem funktioniert mein Autofill jetzt so wie man das intuitiv erwartet (die Funktion habe ich mir von meinem Tax Programm abgeschaut).

    Vielen Dank an alle Ratgeber, Daumen hoch und Problem gelöst.

    LG
    Peter

    Peter329 schrieb:

    Denn bei der Eingabe von ":" darf der markierte Text (Autofill Vorschlag) nicht gelöscht werden !
    Dafür gibt es im KeyDown die Property KeyEventArgs.SuppressKeyPress.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Jau ... das funktioniert .... Jetzt habe ich die Sache mit dem KeyPress ausgebaut. Mein Coding ist dadurch zwar nur ein paar Zeilen kürzer ... aber halt auch deutlich übersichtlicher. Danke !

    LG
    Peter