锁定文本框中的有效字符
-
05-07-2019 - |
题
我需要能够锁定文本框中的有效字符,我现在有一个正则表达式,我可以检查每个字符,如
[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;
}
}