1

我需要能够锁定文本框中的有效字符,我目前有一个正则表达式,我可以检查每个字符,例如

[A-Z-Z]

将锁定为仅 Alpha 字符。

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 键运行一次,但看不到任何修饰键。

处理这种情况的最佳方法是什么?

4

5 回答 5

4

MaskedTextBox可能适合您。

您还可以在 CodeProjct 上查看FilterTextBox。您可以使用它(或描述的方法)来做您想做的事情。基本思想是在更改变得可见之前取消更改(通过 OnTextChanging 事件)。

于 2008-10-31T07:32:40.737 回答
2

如果您将验证放在 OnTextChanged 而不是 OnKeyPress 中,但每次通过验证时您将值保存到变量中怎么办?然后,如果用户粘贴或键入了不正确的字符串,您可以恢复,以及提供一些其他 UI 提示某些内容无效(例如,设置标签的文本)。

于 2008-10-31T06:42:37.170 回答
1

为什么不在 OnTextChanged 事件中检查有效字符

然后在on键下处理Ctrl+C、Ctrl+V

您也可以使用 e.ModifierKeys == Keys.Control 来测试控制键

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

于 2008-10-31T05:42:28.057 回答
0

您可以使用 OnKeyPress / OnKeyUp / OkKeyDown 事件之一,然后使用 Char.IsLetter 方法检查输入的键是否为字母。

于 2008-10-31T07:59:16.330 回答
0

我想出的解决方案是检查 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;
    }
  }
于 2008-11-20T00:51:10.903 回答