Вопрос

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

[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;
    }
  }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top