How to get char from KeyCode on KeyPress for OEM?
我有一个NumericTextBox组件,该组件在WinForms应用程序中扩展了TextBox。为了过滤在文本框中输入的字符,我重写了OnKeyPress方法,并从Keys枚举中检查数字KeyCodes。
这很好用。
我的问题是扩展此NumericTextBox,所以我创建了一个CurrencyTextBox并放入该coe以进行格式设置等。
使我的NumericTextBox可扩展的解决方案是创建一个方法,该方法具有一个char数组,用于此文本框的接受字符(不是数字)。因此,在我的OnKeyPress方法中,我在char数组上进行迭代,以检查所按下的键是否在内部并允许该键。
我的问题是,在我的NumericTextBox中,因为我只允许键入数字,所以不能键入逗号和句点,因此在KeyPress中,代码具有OEMComma和OEMPeriod,它们与chars(',' ,'。')。
我检查接受字符的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | protected override void OnKeyDown(KeyEventArgs e) { ... var acceptedChars = false; // AcceptedChars is a String Property with all chars that this textBox should accept foreach (var acceptedChar in AcceptedChars.ToCharArray()) { if (acceptedChar == Convert.ToChar(e.KeyCode)) { acceptedChars = true; break; } } ... } |
当我打逗号时,KeyCode带有188(即OEMComma),Convert.ToChar()函数将其转换为'1/4'。
PS:我不使用OnKeyPress事件,因为我想防止键入并且不正确键入键入的内容。
tis为我工作:
1 2 3 4 5 | protected override void OnKeyPress(KeyPressEventArgs e) { base.OnKeyPress(e); if (false == Char.IsDigit(e.KeyChar) && e.KeyChar != ',' && e.KeyChar != '.') e.Handled = true; } |
魔术设置为e.Handled = true,这样字符就永远不会进入文本框
这对我有用,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | protected override void OnKeyDown(KeyEventArgs e) { ... var acceptedChars = false; // AcceptedChars is a String Property with all chars that this textBox should accept KeysConverter kc = new KeysConverter(); string keyChar = kc.ConvertToString(e.KeyData); foreach (var acceptedChar in AcceptedChars.ToCharArray()) { if (acceptedChar == Convert.ToChar(keyChar)) { acceptedChars = true; break; } } ... } |