1---------------------------------------------------------
使用NumericUpDown控件。 当需要获取简单数字输入时,在.NET世界中最直接的方法不是去想办法与TextBox搏斗,而应该换个控件来用——NumericUpDown。这个控件不但能接受来自键盘的数字输入,还有一组上下箭头来步进。它包含了许多可以设置的属性,例如显示分隔符逗号的bool ThousandsSeparator、控制最小/最大值的decimal Minimum/decimal Maximum属性等。
下面对这几种解决方法的其中一些稍微讨论一下。
一、继承TextBox并覆盖其CreateParams属性
使用这种方法的NumericTextBox的实现(代码的第1-12行)及用例:
C#代码
运行程序,在输入任意非0-9的字符时的样子:
(截图反映的是在我的简体中文Windows XP上的运行效果;若系统语言不是简体中文的话会根据系统语言而不同)
如果这个文本框已经能满足需求,就没必要自己监听KeyDown事件那么麻烦了。
2----------------------------------------------------------------------------------------
二、自行监听KeyDown事件
可以参考CodeProject上Numeric TextBox : Allow your users to enter numeric data the easy way的实现方式。基本原理就是在KeyDown的响应方法中对e.KeyCode进行判断,如果输入不满足条件则设置某个标识,然后再KeyPress的响应方法里设置e.Handled = true;来取消该次事件。
最简单来说类似这样:
C#代码
(判断逻辑来自KeyEventArgs在MSDN文档上的范例代码)
得到的文本框外观与一般的TextBox没区别,只是无法由键盘输入数字字符以外的字符。要避免任意字符串被复制-粘贴进来的话,要另外做些判断。这里就不详细写了。
3----------------------------------------------------------------------------
三、使用MaskedTextBox
使用例子:
C#代码
这段代码是手写的;要是用VS2005/VS2008的设计器的话,这个例子的所有功能都能直接在设计器里指定。
输入内容(可以看到分隔符都不需要自己写了,已经写好在输入框里;只要填空就行):
输入内容不符合Mask属性指定的模式时:
4------------------------------------------------------------
四、使用NumericUpDown
C#代码
这段代码是手写的;要是用VS2005/VS2008的设计器的话,这个例子的所有功能都能直接在设计器里指定。
NumericUpDown的内容的值可以用Value属性来设置或获取,类型为decimal。
截图:(输入不符合要求的字符时,默认行为是beep一下,没有工具条的提示)