更人性化地控制用户输入(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的情况),如果需要控制输入纯数字,请在第二、三部分加入相应代码。

 

 

posted @ 2008-09-04 23:52  王伟晔  阅读(519)  评论(2编辑  收藏  举报