2012-01-28 14 views
0

私は入力を10進数に制限したいテキストボックスを持つSilverlightアプリケーションを持っています。ウェブの検索私は次の可能な解決策を見つけました(同じ行のコードの著者を主張している別の人々と別々の場所で不思議なことに) 少なくとも1つの数字が入力された後、 d 'を入力すると大文字と小文字のどちらにも入力できないので、なぜそれが起こっているのか理解できず、そのことを防ぐ方法を見つけることができません。誰でも解決策を提供してください。どうもありがとう。小数点のみを受け入れるSilverlightテキストボックス

private void Unit_KeyDown(object sender, KeyEventArgs e) 
    { 

     if (e.Key == Key.Tab) 
     { 

     } 
     var thisKeyStr = ""; 
     if (e.PlatformKeyCode == 190 || e.PlatformKeyCode == 110) 
     { 
      thisKeyStr = "."; 
     } 
     else 
     { 
      thisKeyStr = e.Key.ToString().Replace("D", "").Replace("NumPad", ""); 
     } 
     var s = (sender as TextBox).Text + thisKeyStr; 
     var rStr = "^[0-9]+[.]?[0-9]*$"; 
     var r = new Regex(rStr, RegexOptions.IgnoreCase); 
     e.Handled = !r.IsMatch(s); 

    } 

答えて

2

次の操作を試みることができる:

  1. else if (e.Key != Key.D)または
  2. elseは、このようなHandledプロパティ設定に置き換え:ここ

    e.Handled = !r.IsMatch(s) || string.IsNullOrEmpty(thisKeyStr); 
    
    // also possible: 
    e.Handled = !r.IsMatch(s) || e.Key == Key.D; 
    
+0

おかげで、あなた//も可能NO:私のために最善を動作するようです解決策がある、おかげで再び。 – user995689

2

を簡単ですコード最適化。オブジェクト作成なし。文字列そのための比較ですとNO正規表現の検証

private static void TextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     //platform code for Hyphen which is not same as Subtract symbol but in our case both give same meaning 
     const int KEYCODE_Hyphen_OnKeyboard = 189; 
     const int KEYCODE_Dot_OnKeyboard = 190; 
     const int KEYCODE_Dot_OnNumericKeyPad = 110; 

     e.Handled = !(
      (!(//No modifier key must be pressed 
       (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift 
       || (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control 
       || (Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt 
      ) 
      && (//only these keys are supported 
       (e.Key >= Key.D0 && e.Key <= Key.D9) || (e.Key >= Key.NumPad0 && e.Key <= Key.NumPad9) 
       || e.Key == Key.Subtract || e.Key == Key.Add || e.Key == Key.Decimal 
       || e.Key == Key.Home || e.Key == Key.End || e.Key == Key.Delete 
       || e.Key == Key.Tab || e.Key == Key.Enter || e.Key == Key.Escape || e.Key == Key.Back 
       || (e.Key == Key.Unknown && (
         e.PlatformKeyCode == KEYCODE_Hyphen_OnKeyboard 
         || e.PlatformKeyCode == KEYCODE_Dot_OnKeyboard || e.PlatformKeyCode == KEYCODE_Dot_OnNumericKeyPad 
        ) 
       ) 
      ) 
     ) 
     ); 
    } 
+0

これは最適な解決策ですが、修飾子を使用不可にすると、ユーザーはキーボードを使用して選択、コピー、切り取り、貼り付けを行うことができなくなります。 –

0
 private void TextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     bool isDigit = e.Key >= Key.D0 && e.Key < Key.D9 || e.Key == Key.NumPad0 || e.Key == Key.NumPad1 || e.Key == Key.NumPad2 || e.Key == Key.NumPad3 || e.Key == Key.NumPad4 || e.Key == Key.NumPad5 || e.Key == Key.NumPad6 || 
     e.Key == Key.NumPad7 || e.Key == Key.NumPad8 || e.Key == Key.NumPad9 ||e.Key == Key.Back || e.Key == Key.Delete || e.Key == Key.Left || e.Key == Key.Right; 

     if (isDigit) { } 
     else 
      e.Handled = true; 
    } 
関連する問題