(原创文章,转载请注明来源:http://blog.youkuaiyun.com/hulihui)
著名的Delphi开源控件包PBEditPack中的 PBNumEdit处理数值型数据效果较好,但没有提供相应的.NET或C#版。去年,在codeproject上找到一个.NET的数值型文本框开源控件 BANumEdit ,它支持CTRL+V/CTRL+C操作,代码短小精练,构思巧妙,但灵活度大不如PBNumEdit。
笔者熟悉Delphi且感到PBNumEdit实在好用,于是决定将其源代码PBNumEdit.pas改编成C#版,核心思路如下:
特别,该控件更详细的技术说明也请浏览codeproject上的相关说明。由于时间仓促,测试没有面面俱到,欢迎使用者提出意见和建议,笔者将继续完善TNumEditBox。
- 请到www.codeproject.com下载演示及源代码TNumEditBox
- 更详细的技术说明也请浏览网页TNumEditBox

著名的Delphi开源控件包PBEditPack中的 PBNumEdit处理数值型数据效果较好,但没有提供相应的.NET或C#版。去年,在codeproject上找到一个.NET的数值型文本框开源控件 BANumEdit ,它支持CTRL+V/CTRL+C操作,代码短小精练,构思巧妙,但灵活度大不如PBNumEdit。
笔者熟悉Delphi且感到PBNumEdit实在好用,于是决定将其源代码PBNumEdit.pas改编成C#版,核心思路如下:
- 由两个类组成:文本框TTextBoxEx从TextBox派生,用于设置只读时保持背景颜色,数值编辑框TNumEditBox从TTextBoxEx派生,用于处理数值数据;
- PBNumEdit没有重载ProcessCmdKey(Delphi中无该方法),在处理Ctrl+V/Ctrl+C/ShiftIns时存在一些Bug。于是借鉴BANumEdit的思路,重载该事件,完善键盘粘贴数据操作;
- Delphi有消息处理方法SendMessage,有鼠标操作方法WMPaste、WMCopy、WMCut,C#没有对应函数,但TextBox有WndProc事件(一般C#控件都有),利用该事件可以完成鼠标消息处理,也可以模拟SendMessage;
- Delphi的字符串下标为1,且TextBox控件SelStart、SelLength等属性、Copy等函数有自动纠错,例如:可以取负数而不报错,C#需要编程者注意;
- 程序主要处理键盘消息和鼠标消息,重载了:OnKeyUp、OnKeyPress、ProcessCmdKey、WndProc、OnLeave、OnReadOnlyChanged、OnBackColorChanged。
控件TNumEditBox具有如下属性
- AllowNegative:是否允许录入负数
- DecimalLength:小数位长,为0时表示整数,最大取10位
- Value:直接取 Text 对应的 decimal 值
- IntValue:直接取 Text 对应的 int 值
- KeepBackColorWhenReadOnly:只读时可以保持背景颜色(TextBox没有该功能)
特别,该控件更详细的技术说明也请浏览codeproject上的相关说明。由于时间仓促,测试没有面面俱到,欢迎使用者提出意见和建议,笔者将继续完善TNumEditBox。
修改于2008年9月30日