更人性化地控制用户输入(2 of n) 只限输入数字字符
界面有这样的需求,部分输入框(如电话号码等),只允许输入数字字符。大家怎样解决呢?有人说用正则表达式处理验证事件。我觉得这样晚了一点,而且很难控制全面。
我向大家推荐一种继承TextBox的做法。
public class DPTextBox : TextBox
{
public DPTextBox() : base()
{
base.ImeMode = ImeMode.Disable;
}
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.V))
{
try
{
string s = Clipboard.GetText();
foreach (char c in s)
{
if (char.IsLetter(c)) return true;
}
}
catch
{
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
if (char.IsLetter(e.KeyChar))
{
e.Handled = true;
}
base.OnKeyPress(e);
}
}
这种做法分为三部分,
第一部分:构造方法里面base.ImeMode = ImeMode.Disable; 是避免用户输入全角字符;
第二部分:覆盖ProcessCmdKey,是为了防止通过剪贴板{Ctrl+V}带入非数字字符,如果剪贴板字符串数据带有字母,操作将取消。
第三部分:覆盖OnKeyPress,是为了用户输入字符数字是跳过处理Press的。
处理这一需求的方法还有多种(例如,在第二部分处理所有的判断,不用第三部分,但我认为那样写的逻辑相对比较复杂),出于代码应该是尽量简单的原则,就分开了三部分。注意,这段代码并没有处理标点符号,因为只是考虑输入的是非字符(例如电话,就会有(+86)20-88888888的情况),如果需要控制输入纯数字,请在第二、三部分加入相应代码。