关于c#:如何从KeyPress for OEM的KeyCode中获取字符?

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;
        }
    }
...
}