Laden...

TextBox KeyDown - Zahlen aus Numblock haben falschen Ascii Wert

Erstellt von inflames2k vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.977 Views
Thema geschlossen
inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 11 Jahren
TextBox KeyDown - Zahlen aus Numblock haben falschen Ascii Wert

Hallo,

in einer Anwendung die bereits beim Kunden ausgeliefert ist, können Bestellmengen erfasst werden. Diese müssen natürlich nummerisch sein. Kommas sind zusätzlich erlaubt.

Funktioniert Prima durch Unterdrücken der restlichen Zeichen im KeyPress-Event. Nun gibt es allerdings noch das Verhalten, das wenn der Text der Textbox markiert ist, alle Zeichen möglich sind.

Meine Idee war nun, im KeyDown nochmal gegen zu prüfen und mittels KeyEventArgs.SuppressKeyPress alle Zeichen die ungültig sind zu unterdrücken.

Hier habe ich allerdings festgestellt, das die Nummern auf dem Numblock falsche Ascii Werte liefern, so wird die 5 z.B. zu einem 'e'.

Hat jemand eine Idee, woran das liegen könnte? Ist das in Irgendeiner Weise Standard?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
224 Beiträge seit 2009
vor 11 Jahren

Hi inflames2k,

also ich benutze hier VS 2008 auf XP.
Bei mir passiert nichts merkwürdiges mit meiner Testanwendung:


        //Auf einem leeren Formular hinzufügen:
        //  TextBox txtInput;
        //  Label lblDown;
        //  Label lblPress;
        //  Label lblUp;
        //  chkSupressPress;
        //
        //  Ereignis txtInput.KeyDown
        //  Ereignis txtInput.KeyUp
        //  Ereignis txtInput.KeyPress


        private void txtInput_KeyDown(object sender, KeyEventArgs e)
        {
            string text= e.KeyCode + "|" + e.KeyData + "|" + e.KeyValue;
            SetLabel(lblDown, text);

            e.SuppressKeyPress = chkSupressPress.Checked;
        }
        private void txtInput_KeyUp(object sender, KeyEventArgs e)
        {
            string text = e.KeyCode + "|" + e.KeyData + "|" + e.KeyValue;
            SetLabel(lblUp, text);
        }

        private void txtInput_KeyPress(object sender, KeyPressEventArgs e)
        {
            string text = ((int)e.KeyChar) + "|" + e.KeyChar;
            SetLabel(lblPress,text);
        }



        private void SetLabel(Label lbl, string text)
        {
            lbl.Text = text;
            if (lbl.BackColor == Color.Lime)
                lbl.BackColor = Color.Yellow;
            else
                lbl.BackColor = Color.Lime
            ;
        }

Wenn ich "qwertz" eingebe und selektiere, und chkSupressPress.Checked = true dann passiert
mit KeyPress nichts.

Wenn ich "qwertz" eingebe und selektiere, und chkSupressPress.Checked = false dann passiert mit KeyPress:

  • bei Numblock Taste '1' mit 'Num' wird e.KeyChar zu '1' und wird ausgeführt
  • bei Numblock Taste '1' ohne 'Num' wird KeyPress nicht ausgeführt. Der Textcursor wird zum Ende bewegt.

Gruß, CoLo

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 11 Jahren

Hallo CoLo,

ja bei deinem Beispiel mag das so stimmen. Der Punkt ist aber, das im KeyDown kein Zugriff auf den KeyChar möglich ist. Und der KeyValue entspricht 101 -> 'e'.

Mein Problem ist eben, das ich im KeyDown schon einmal prüfen möchte.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
224 Beiträge seit 2009
vor 11 Jahren

Anscheinend ist KeyValue = KeyCode. 😉

KeyEventArgs.KeyValue

Property Value
Type: System.Int32
The integer representation of the KeyCode property.

-> System.Windows.Forms.Keys.NumPad5 = 101

C
258 Beiträge seit 2011
vor 11 Jahren

Das Mapping von KeyValue (dem tatsächlichen input wert) auf einen KeyChar gibt es leider nicht im Framework.
Wenn du im KeyDown bereits den aus der KeyValue resultierenden Char willst hilft dir vielleicht dieser Beitrag weiter: Get the char on Control.KeyDown?

PS: @CoLo nein KeyValue ist nicht KeyChar du bekommst für KeyValue immer den selben Wert für die taste Z unabhängig vom Tastaturlayout / Shift Taste etc.

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 11 Jahren

Naja, dann werd ich mal nach einem anderen Weg schauen. Wenns alles nichts hilft, werd ich wohl zur MaskedTextbox umsteigen müssen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

D
216 Beiträge seit 2009
vor 11 Jahren

Wäre da nicht ein NumericUpDown besser geeignet?

inflames2k Themenstarter:in
2.298 Beiträge seit 2010
vor 11 Jahren

Nein, unser Kunde gibt uns feste Anforderungen vor. Da fällt ein NumericUpDown leider nicht rein.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

C
224 Beiträge seit 2009
vor 11 Jahren

@Console32:
in meinem ersten Post nahm ich an, das 'e' Problem läge im KeyPress Event.
Zu diesem Zeitpunkt hatte ich nicht vor, KeyValue mit KeyChar gleichzusetzen.
Das ist ein Missverständnis.

MfG, CoLo

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo inflames2k,

es ist nicht zielführend, falsche Eingaben im KeyPress/KeyDown abzufangen, denn man bekommt Eingaben in eine TextBox nicht nur über die Tastatur. Die einzig sichere Herangehensweise ist im TextChanged zu prüfen. Das steht aber alles in der FAQ, siehe [FAQ] In einer TextBox nur bestimmte Zeichen/Eingaben zulassen.

herbivore

Thema geschlossen