Блокировка допустимых символов в текстовом поле
-
05-07-2019 - |
Вопрос
Мне нужно иметь возможность блокировать допустимые символы в текстовом поле, в настоящее время у меня есть регулярное выражение, по которому я могу проверять каждый символ, например
[A-Za-z]
ограничился бы только буквенными символами.
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Back)
{
base.OnKeyPress(e);
return;
}
if (String.IsNullOrEmpty(this._ValidCharExpression))
{
base.OnKeyPress(e);
}
else
{
bool isValidChar = Regex.Match(e.KeyChar.ToString(),this._ValidCharExpression).Success;
if (isValidChar)
{
base.OnKeyPress(e);
}
else
{
e.Handled = true;
}
}
}
Я поместил код регулярного выражения в код OnKeyPress, но я хотел разрешить все специальные клавиши, такие как Ctrl-V, Ctrl-C и Backspace.
Как вы можете видеть, у меня обрабатывается клавиша backspace.Однако Ctrl-V, например, не может видеть клавишу V, потому что она запускается один раз для клавиши ctrl, но не видит никаких клавиш-модификаторов.
Каков наилучший способ справиться с этой ситуацией?
Решение
Вы можете использовать одно из событий OnKeyPress / OnKeyUp / OkKeyDown, а затем использовать Char.Метод isLetter, чтобы проверить, является ли введенный ключ буквой.
Другие советы
Маскированный текстовый блок может быть, это подходит именно вам.
Вы также можете посмотреть на Текстовый блок фильтра в CodeProjct.Вы можете использовать его (или описанный подход), чтобы делать то, что вы намереваетесь.Основная идея состоит в том, чтобы отменить изменение до того, как оно станет видимым (с помощью события OnTextChanging).
Что, если вы помещаете проверку в onTextChanged вместо OnKeyPress, но каждый раз, когда он проходит проверку, вы сохраняете значение в переменной?Затем вы можете отменить, если пользователь вставляет или вводит неправильную строку, а также дать какой-либо другой подсказке пользовательского интерфейса о том, что что-то было недопустимым (напримерустановите текст метки).
Почему бы вам не установить проверку на наличие допустимых символов в событии onTextChanged
а затем разберитесь с Ctrl + C, Ctrl + V в клавише вкл.
Также вы можете использовать e.ModifierKeys == Клавиши.Элемент управления для проверки наличия управляющих клавиш
http://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.aspx
Решение, которое я придумал, состоит в том, чтобы проверить ключи в событии OnKeyDown, а затем установить флаг, если нажатие клавиши должно быть обработано, что затем проверяется в событии OnKeyPress.
protected override void OnKeyDown(KeyEventArgs e)
{
Keys keyCode = (Keys)e.KeyValue;
base.OnKeyDown(e);
if ((e.Modifiers == Keys.Control) ||
(e.Modifiers == Keys.Control) ||
(keyCode == Keys.Back) ||
(keyCode == Keys.Delete))
{
this._handleKey = true;
}
else
{
// check if the key is valid and set the flag
this._handleKey = Regex.Match(key.ToString(), this._ValidCharExpression).Success;
}
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (this._handleKey)
{
base.OnKeyPress(e);
this._handleKey = false;
}
else
{
e.Handled = true;
}
}