Блокировка действительных символов в текстовом поле - PullRequest
1 голос
/ 31 октября 2008

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

[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, были разрешены.

Как видите, у меня обрабатывается клавиша возврата. Однако, например, Ctrl-V не может видеть клавишу V, потому что он запускается один раз для клавиши ctrl, но не видит клавиш-модификаторов.

Как лучше всего справиться с этой ситуацией?

Ответы [ 5 ]

4 голосов
/ 31 октября 2008

MaskedTextBox может быть правильным для вас.

Вы также можете посмотреть на FilterTextBox на CodeProjct. Вы можете использовать его (или описанный подход), чтобы делать то, что вы намерены. Основная идея состоит в том, чтобы отменить изменение до того, как оно станет видимым (через событие OnTextChanging).

2 голосов
/ 31 октября 2008

Что если вы положите проверку в OnTextChanged вместо OnKeyPress, но каждый раз, когда она проходит проверку, вы сохраняете значение в переменную? Затем вы можете вернуться, если пользователь вставит или введет неправильную строку, а также дать какой-то другой интерфейс пользовательского интерфейса, указывающий на то, что что-то было недопустимым (например, установить текст метки).

1 голос
/ 31 октября 2008

Почему бы вам не поставить проверку на допустимые символы в событии OnTextChanged

, а затем нажмите Ctrl + C, Ctrl + V при нажатой клавише

Также вы можете использовать e.ModifierKeys == Keys.Control для проверки управляющих клавиш

http://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.aspx

0 голосов
/ 20 ноября 2008

Решение, которое я придумала, состоит в том, чтобы проверить ключи в событии 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;
    }
  }
0 голосов
/ 31 октября 2008

Вы можете использовать одно из событий OnKeyPress / OnKeyUp / OkKeyDown, а затем использовать метод Char.IsLetter, чтобы проверить, является ли введенный ключ буквой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...