- 浏览: 3017536 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
在MFC里需要获取文本输入时,经常会用到CEdit或者它的子类。可以通过设置它的Edit Control Styles来控制Edit控件的一些行为,例如说设置ES_NUMBER标识使控件只允许接受数字(虽然可以复制-粘贴非数字字符串到这个控件中)。
在.NET中,用于获取文本输入的控件是TextBox,但TextBox本身并不包含可以直接调用的方法或属性来将其设置为只接受数字输入。这个问题有好几种方法来解决:
下面对这几种解决方法的其中一些稍微讨论一下。
=========================================================================================
一、继承TextBox并覆盖其CreateParams属性
使用这种方法的NumericTextBox的实现(代码的第1-12行)及用例:
运行程序,在输入任意非0-9的字符时的样子:
(截图反映的是在我的简体中文Windows XP上的运行效果;若系统语言不是简体中文的话会根据系统语言而不同)
如果这个文本框已经能满足需求,就没必要自己监听KeyDown事件那么麻烦了。
=========================================================================================
二、自行监听KeyDown事件
可以参考CodeProject上Numeric TextBox : Allow your users to enter numeric data the easy way的实现方式。基本原理就是在KeyDown的响应方法中对e.KeyCode进行判断,如果输入不满足条件则设置某个标识,然后再KeyPress的响应方法里设置e.Handled = true;来取消该次事件。
最简单来说类似这样:
(判断逻辑来自KeyEventArgs在MSDN文档上的范例代码)
得到的文本框外观与一般的TextBox没区别,只是无法由键盘输入数字字符以外的字符。要避免任意字符串被复制-粘贴进来的话,要另外做些判断。这里就不详细写了。
=========================================================================================
三、使用MaskedTextBox
使用例子:
这段代码是手写的;要是用VS2005/VS2008的设计器的话,这个例子的所有功能都能直接在设计器里指定。
输入内容(可以看到分隔符都不需要自己写了,已经写好在输入框里;只要填空就行):
输入内容不符合Mask属性指定的模式时:
=========================================================================================
四、使用NumericUpDown
这段代码是手写的;要是用VS2005/VS2008的设计器的话,这个例子的所有功能都能直接在设计器里指定。
NumericUpDown的内容的值可以用Value属性来设置或获取,类型为decimal。
截图:(输入不符合要求的字符时,默认行为是beep一下,没有工具条的提示)
呃呵呵,我这边也只是做个笔记而已……最近在写些东西,这个记下来给同学看。
.NET 2.0也出来那么久了,这种WinForm控件早就被专业的摸透了…… ^ ^
那要看写什么库吧……
嘛,还有好几篇草稿在后面。这两天在弄Ruby+wxRuby+wxWidgets+wxFormBuilder相关,看什么时候能写完。
在.NET中,用于获取文本输入的控件是TextBox,但TextBox本身并不包含可以直接调用的方法或属性来将其设置为只接受数字输入。这个问题有好几种方法来解决:
- 继承TextBox并覆盖其CreateParams属性,对该属性的Style成员添加ES_NUMBER标识; 这个方法与MFC中用Edit Control Styles来初始化CEdit一样。可以说是最偷懒的方法。
- 自行监听TextBox的KeyDown事件,实现输入验证(但不保证复制-粘贴输入的正确性); 其实设置ES_NUMBER做的也是这件事,如果要实现的功能与Windows控件中默认的一样的话没必要自己监听KeyDown事件;如果需要些额外的功能,例如说允许输入负数、十六进制数等默认没有的功能时,则监听KeyDown事件是个有效的方式。
- 使用第三方编写的继承自TextBox的控件; 这是拥有“不重复发明轮子”精神的人们的做法。既然获取数字输入应该是个常见问题,之前也肯定有人解决过,那么利用别人的解决方案就行。
- 使用MaskedTextBox 控件; 这是.NET Framework自带的一个TextBox的子类,实现了一个带过滤功能的TextBox,可以自定义接受的输入内容的格式。只要设置其string Mask属性即可。如果觉得ES_NUMBER的功能不够用,而自行监听KeyDown事件来做验证不够优雅的话,这个MaskedTextBox绝对是值得考虑的选择。例如说,要接受0到999999的数字,只要把Mask属性设为"999,999.00"就行(意味着六位的可选十进制数字,一个小数点,和两位必须输入的小数)。MSDN上对这个控件有个简单的walkthrough。
- 使用NumericUpDown控件。 当需要获取简单数字输入时,在.NET世界中最直接的方法不是去想办法与TextBox搏斗,而应该换个控件来用——NumericUpDown。这个控件不但能接受来自键盘的数字输入,还有一组上下箭头来步进。它包含了许多可以设置的属性,例如显示分隔符逗号的bool ThousandsSeparator、控制最小/最大值的decimal Minimum/decimal Maximum属性等。
光是CodeProject上就有好几个与这个相关的实现:
Validating Edit Controls。包括了NumericTextBox、AlphanumericTextBox、DateTextBox等许多版本的TextBox子类。值得一看。
A numeric textbox with a twist。
Numeric TextBox : Allow your users to enter numeric data the easy way。
下面对这几种解决方法的其中一些稍微讨论一下。
=========================================================================================
一、继承TextBox并覆盖其CreateParams属性
使用这种方法的NumericTextBox的实现(代码的第1-12行)及用例:
public class NumericTextBox : System.Windows.Forms.TextBox { private const int ES_NUMBER = 0x2000; // ( defined in WinUser.h ) protected override System.Windows.Forms.CreateParams CreateParams { get { System.Windows.Forms.CreateParams cp = base.CreateParams; cp.Style |= ES_NUMBER; return cp; } } } #region use case code sample sealed class TestForm : System.Windows.Forms.Form { private NumericTextBox m_ntxt; public TestForm() { InitializeComponent(); } private void InitializeComponent() { this.m_ntxt = new NumericTextBox(); this.m_ntxt.Dock = System.Windows.Forms.DockStyle.Fill; this.ClientSize = new System.Drawing.Size(100, 60); this.Controls.Add(this.m_ntxt); this.PerformLayout(); } [System.STAThread] static void Main(string[] args) { System.Windows.Forms.Application.EnableVisualStyles(); System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); System.Windows.Forms.Application.Run(new TestForm()); } } #endregion
运行程序,在输入任意非0-9的字符时的样子:
(截图反映的是在我的简体中文Windows XP上的运行效果;若系统语言不是简体中文的话会根据系统语言而不同)
如果这个文本框已经能满足需求,就没必要自己监听KeyDown事件那么麻烦了。
=========================================================================================
二、自行监听KeyDown事件
可以参考CodeProject上Numeric TextBox : Allow your users to enter numeric data the easy way的实现方式。基本原理就是在KeyDown的响应方法中对e.KeyCode进行判断,如果输入不满足条件则设置某个标识,然后再KeyPress的响应方法里设置e.Handled = true;来取消该次事件。
最简单来说类似这样:
using System; using System.Drawing; using System.Windows.Forms; sealed class TestForm : Form { private TextBox m_textBox; private bool m_nonNumberEntered = false; public TestForm() { InitializeComponent(); } private void InitializeComponent() { this.m_textBox = new TextBox(); this.m_textBox.Dock = DockStyle.Fill; this.m_textBox.KeyDown += m_textBox_KeyDown; this.m_textBox.KeyPress += m_textBox_KeyPress; this.ClientSize = new Size(100, 60); this.Controls.Add(this.m_textBox); this.PerformLayout(); } private void m_textBox_KeyDown(object sender, KeyEventArgs e) { // Initialize the flag to false. m_nonNumberEntered = false; // Determine whether the keystroke is a number from the top of the keyboard. if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) { // Determine whether the keystroke is a number from the keypad. if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) { // Determine whether the keystroke is a backspace. if(e.KeyCode != Keys.Back) { // A non-numerical keystroke was pressed. // Set the flag to true and evaluate in KeyPress event. m_nonNumberEntered = true; } } } } private void m_textBox_KeyPress(object sender, KeyPressEventArgs e) { // Check for the flag being set in the KeyDown event. if (m_nonNumberEntered) { // Stop the character from being entered into the control // since it is non-numerical. e.Handled = true; } } [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new TestForm()); } }
(判断逻辑来自KeyEventArgs在MSDN文档上的范例代码)
得到的文本框外观与一般的TextBox没区别,只是无法由键盘输入数字字符以外的字符。要避免任意字符串被复制-粘贴进来的话,要另外做些判断。这里就不详细写了。
=========================================================================================
三、使用MaskedTextBox
使用例子:
using System; using System.Windows.Forms; sealed class TestForm : Form { private MaskedTextBox m_maskedTextBox; private ToolTip m_toolTip; public TestForm() { InitializeComponent(); } private void InitializeComponent() { this.m_maskedTextBox = new MaskedTextBox(); this.m_maskedTextBox.Mask = "999,999.00"; this.m_maskedTextBox.Dock = DockStyle.Fill; this.m_maskedTextBox.MaskInputRejected += m_maskedTextBox_InputRejected; this.m_maskedTextBox.KeyDown += m_maskedTextBox_KeyDown; this.m_toolTip = new ToolTip(); this.ClientSize = new Size(100, 60); this.Controls.Add(this.m_maskedTextBox); this.PerformLayout(); } private void m_maskedTextBox_InputRejected(object sender, MaskInputRejectedEventArgs e) { toolTip.ToolTipTitle = "Invalid Input"; toolTip.Show("Only digits (0-9) are allowed.", m_maskedTextBox, m_maskedTextBox.Location, 5000); } private void m_maskedTextBox_KeyDown(object sender, KeyEventArgs e) { m_toolTip.Hide(maskedTextBox); } [STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new TestForm()); } }
这段代码是手写的;要是用VS2005/VS2008的设计器的话,这个例子的所有功能都能直接在设计器里指定。
输入内容(可以看到分隔符都不需要自己写了,已经写好在输入框里;只要填空就行):
输入内容不符合Mask属性指定的模式时:
=========================================================================================
四、使用NumericUpDown
using System; using System.Drawing; using System.Windows.Forms; sealed class TestForm : Form { private NumericUpDown m_numericUpDown; public TestForm() { InitializeComponent(); } private void InitializeComponent() { this.m_numericUpDown = new NumericUpDown(); this.m_numericUpDown.Value = 100; this.m_numericUpDown.Dock = DockStyle.Fill; this.m_numericUpDown.ThousandsSeparator = true; this.m_numericUpDown.Maximum = int.MaxValue; this.ClientSize = new Size(100, 60); this.Controls.Add(this.m_numericUpDown); this.PerformLayout(); } [System.STAThread] static void Main(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new TestForm()); } }
这段代码是手写的;要是用VS2005/VS2008的设计器的话,这个例子的所有功能都能直接在设计器里指定。
NumericUpDown的内容的值可以用Value属性来设置或获取,类型为decimal。
截图:(输入不符合要求的字符时,默认行为是beep一下,没有工具条的提示)
评论
5 楼
碧海山城
2009-07-01
MaskedTextBox 的提示符如果可以不显示出来就比较强大了。。现在用的很郁闷
4 楼
RednaxelaFX
2008-04-07
java998 写道
这个控件我们公司的产品里面早就用到了.
呃呵呵,我这边也只是做个笔记而已……最近在写些东西,这个记下来给同学看。
.NET 2.0也出来那么久了,这种WinForm控件早就被专业的摸透了…… ^ ^
3 楼
java998
2008-04-07
这个控件我们公司的产品里面早就用到了.
2 楼
RednaxelaFX
2008-04-06
lwwin 写道
大家不太用纯WIN32 api写LIB么?
那要看写什么库吧……
嘛,还有好几篇草稿在后面。这两天在弄Ruby+wxRuby+wxWidgets+wxFormBuilder相关,看什么时候能写完。
1 楼
lwwin
2008-04-06
不知道有没有适合WIN32SDK直接用的控件库……
对于界面偶一直抱着偷懒的态度来着=3=,所以最好有个轮子=v=+
大家不太用纯WIN32 api写LIB么?
话说不用MFC和.NET的话,也有很多人用跨平台的LIB去了…………
对于界面偶一直抱着偷懒的态度来着=3=,所以最好有个轮子=v=+
大家不太用纯WIN32 api写LIB么?
话说不用MFC和.NET的话,也有很多人用跨平台的LIB去了…………
发表评论
-
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22264(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对象的重量
2011-08-21 17:15 0http://domino.research.ibm.com/ ... -
GetCustomAttribute()每次都返回新Attribute实例
2009-11-10 10:30 0Jeffrey Zhao: 一次失败的尝试(上):原来GetC ... -
委托与方法和隐藏参数
2009-09-07 15:32 3244之前正好发了些帖子是关于CLR里的委托的,然后看到老赵说事件也 ... -
要让CLR挂掉的话(第二弹)……
2009-09-04 03:26 12768(Disclaimer:如果需要转 ... -
要让CLR挂掉的话……
2009-09-02 16:53 4698(Disclaimer:如果需要转载请先与我联系。 作者:Re ... -
趣味编程:函数式链表的快速排序
2009-08-31 08:53 3377(恢复自2009-08-28的备份 ... -
事件处理器导致内存泄漏
2009-08-25 15:03 0Memory leak via event handlers ... -
C# 3.0的类型推导
2009-08-23 12:24 0Howard Dierking: Lambda, Lambda ... -
把lock的意思给弄混了 T T
2009-08-20 17:49 2553悲剧啊……前几天有个同学不停问我Java里的同步问题,今天写C ... -
把IEnumerable<T>和IObservable<T>粘起来?
2009-07-23 03:02 0Channel 9: Expert to Expert: Br ... -
Scott Peterson: Variance, Thy Name is Ambiguity
2009-07-01 23:49 1591原文作者:Scott Peterson 原文地址:http:/ ... -
void无法协变
2009-06-30 11:17 0Eric Lippert The void is invari ... -
同一个表达式算出来的浮点数结果会不相等?
2009-05-30 03:27 0浮点数有很多可把玩的地方。例如下面这段C程序: #includ ... -
C#开始默认引用Microsoft.CSharp.dll
2009-05-20 16:14 0记得VB6的运行时么?留意到VB.NET的程序都需要额外的VB ... -
反射与显式实现接口的方法
2009-05-20 11:43 4005在前一帖里,我用到了下面三处Expression.Call() ... -
看到一个关于ref参数与多态的问题,记一下
2009-05-18 10:48 1912刚才读到Alan McGovern的一帖,问为什么形式参数是r ... -
C#的+=运算符两例
2009-05-06 18:18 1976刚偶尔看到了justjavac写的java解惑 - 半斤八两( ...
相关推荐
c# .net Wince 数字输入控件 数字键盘 方便触控输入。类似HMI屏数字输入框
C#Text只能输入数字自定义控件。时候新手看。
c# winform textbox控件只能输入数字的几种方法
自制控件:C#中TextBox控件只允许输入数字
C#控件只能输入数字代码 最好弄个自定义控件,继承TextBox,重写OnKeyPress事件
车牌号码输入控件,通过点击输入简称、字母、数字,可自定义简称
C#控件,NumTextBox只可以输入数字,并且可以设置属性对数字作一些处理
非常好用的C#虚拟键盘控件,可以多处调用,源码+调用实例
ASP.Net TextBox控件只允许输入数字的几种方法
C#Winform限制Textbox只能输入数字,很好用的一段代码
利用C#.NET实现PC机与研华ADAM-4050模块数字量输入实例(MSComm控件)
C# textbox只能输入数字 是个不错的参考案例
C# button textbox 控件实现功能: ① 可以硬件键盘输入数字也可以C#编写的软件键盘输入数字; ② 软键盘仅支持;
自定义的一个TextBox控件,包含限制只能输入数字、验证邮箱、电话、手机、身份证号码、邮件地址等功能,提供源码,蛮适合初学者学习和使用的~~
只可输入数字,屏蔽其他字符,用正则表达式
VS2017中C#实现类似工业触摸屏的数字软键盘,应用在工控机PC替代工业触摸屏。此资源包含数字软键盘的最小值和最大值。参考工业触摸屏数字键盘来开发的。
一个简易的软键盘控件,设置关联的textbox控件后,按下按钮输入到关联的textbox,由于Text不知道怎么如何弄上标,所以符号和数字是用图片代替的.颜色的更改可以自己写属性更改;
TextStyle属性控制输入的文本类型,如果选择Numeric,就只能输入数字。选择Upper只能输入大写字母。 只要把生成的MyTextBox.dll 拖到工具箱里。就能直接使用了。 包含完整的源码。注释详细。。适合学习使用。
C# 非常漂亮的UI,显示LED数字屏显,加入VS的工具箱即可使用。还有HEX码输入框,IP地址输入框,欢迎下载使用,让界面更美观。