none
TextBox - erlaubte Zeichen tastaturunabhängig einschränken RRS feed

  • Frage

  • Hallo allerseits!
     
    In meiner Applikation habe ich eine TextBox, in der neben Ziffern nur ein Doppelpunkt
    und ein Bindestrich als Zeichen zulässig sind. Dies stelle ich unter anderem in einem
    Handler für das KeyDown-Ereignis sicher:
     
          private void TextBox_KeyDown(object sender, KeyEventArgs e)
          {
             switch (e.Key)
             {
                   case Key.D0: case Key.NumPad0:
                   /* ... */
                   case Key.D9: case Key.NumPad9:
                      break;
                   case Key.OemMinus:
                      e.Handled = Keyboard.IsKeyDown(Key.LeftShift) ||
                         Keyboard.IsKeyDown(Key.RightShift);
                      break;
                   case Key.OemPeriod:
                      e.Handled = !Keyboard.IsKeyDown(Key.LeftShift) &&
                         !Keyboard.IsKeyDown(Key.RightShift);
                      break;
             }
          }
     
    Das funktioniert soweit auch. Allerdings glaube ich nicht, daß das mit allen anderen
    als der deutschen Tastaturbelegung funktioniert. Da ich bei meiner Applikation davon
    ausgehen kann, daß alle Benutzer eine deutsche Tastatur haben, ist das jetzt zwar
    kein echtes Problem für mich - aber rein interessehalber: wie würde sich das unabhängig
    von der Tastaturbelegung lösen lassen?
     
    TIA
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Donnerstag, 14. Juni 2012 13:05

Antworten

  • Am besten ist es du fängst das PreviewTextInput-Event ab. unter e.Text ist das entsprechnde TZeichen abgelegt:

            private void textBoxContent_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                if (!Regex.IsMatch(e.Text, @"^[0-9:\-]*$)
                    e.Handled = true;
            }

    Ich habe es hier über Regex gelöst. Damit ging es bei meinen Controls immer am schnellsten. Zum testen kann ich http://regexpal.com/ empfehlen. Somit ist die Eingabe auf Tastaturunabhängig.

    Aber denke dran, der Progarmmierer könnte ja auch mal die Text-Eigenschaft ändern bzw. der Benutzer etwas aus der Zwischenablage einfügen. Dann müsstest du das TextChanged-Event benutzen und den Text wie im PreviewTextInput-Event überprüfen (statt e.Text, dann textBox1.Text).


    Koopakiller - http://koopakiller.ko.ohost.de/


    Donnerstag, 14. Juni 2012 13:23
    Moderator

Alle Antworten

  • Am besten ist es du fängst das PreviewTextInput-Event ab. unter e.Text ist das entsprechnde TZeichen abgelegt:

            private void textBoxContent_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                if (!Regex.IsMatch(e.Text, @"^[0-9:\-]*$)
                    e.Handled = true;
            }

    Ich habe es hier über Regex gelöst. Damit ging es bei meinen Controls immer am schnellsten. Zum testen kann ich http://regexpal.com/ empfehlen. Somit ist die Eingabe auf Tastaturunabhängig.

    Aber denke dran, der Progarmmierer könnte ja auch mal die Text-Eigenschaft ändern bzw. der Benutzer etwas aus der Zwischenablage einfügen. Dann müsstest du das TextChanged-Event benutzen und den Text wie im PreviewTextInput-Event überprüfen (statt e.Text, dann textBox1.Text).


    Koopakiller - http://koopakiller.ko.ohost.de/


    Donnerstag, 14. Juni 2012 13:23
    Moderator
  • Hallo Koopakiller!
     
    Danke! Das funktioniert perfekt.
     
    Grüße
    Thomas
     
    --
    Any problem in computer science can be solved with another layer
    of indirection. But that usually will create another problem.
                                       David Wheeler
     
    Donnerstag, 14. Juni 2012 16:05