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

  

[A-ZA-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键运行一次,但没有看到任何修饰键。

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

有帮助吗?

解决方案

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

其他提示

MaskedTextBox 可能适合你。

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

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

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

然后按下Ctrl + C,按下Ctrl + V键下来

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

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

我提出的解决方案是检查OnKeyDown事件中的键,然后设置一个标志,如果应该处理keypress,然后检查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