Как получить символ от KeyCode на KeyPress для OEM? - PullRequest
1 голос
/ 07 марта 2012

У меня есть компонент NumericTextBox, который расширяет TextBox в моем приложении WinForms.Чтобы отфильтровать символы, вводимые в текстовое поле, я переопределил метод OnKeyPress и проверил числовые коды клавиш из перечисления ключей.

Это прекрасно работает.

Моя проблема состоит в том, чтобы расширить этот NumericTextBox, поэтому я создал CurrencyTextBox и вставил этот коэффициент для форматирования и т. д. *

Мое решение сделать расширяемый NumericTextBox - создать метод с массивом char для принятых символов для этого текстового поля, которое не являетсяномера.Поэтому в моем методе OnKeyPress я выполняю итерацию в своем массиве символов, чтобы проверить, находится ли нажатая клавиша внутри, и разрешаю эту клавишу.

Моя проблема заключается в том, что в моем NumericTextBox, поскольку я разрешаю вводить только цифры, я не могу набратьзапятые и точки, в KeyPress код имеет OEMComma и OEMPeriod, которые не совпадают с кодами символов (',', '.').

Мой код, который проверяет принятые символы, выглядит следующим образом:

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: IЯ не использую событие OnKeyPress, потому что я хочу предотвратить ввод и не исправить то, что было напечатано.

Ответы [ 2 ]

1 голос
/ 07 марта 2012

у меня сработало:

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, таким образом, персонаж никогда не попадает в текстовое поле

0 голосов
/ 20 июля 2016

Это сработало для меня,

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;
        }
    }
...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...