最近写winform程序,发现自带的TextBox没发设置输入类型,这就有点痛苦了,查找了网上,没看到比较符合需求的;于是花了点时间,自己自定义了一个简单的数值输入框,实现的方式很简单,继承系统 的TextBox,重写OnTextChanged方法限制输入即可,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace Widgets
{/// <summary>/// 数值输入框/// </summary>public class NumberTextBox : TextBox{/// <summary>/// 输入数值类型/// </summary>private NumberType numberType;/// <summary>/// 输入小数点,默认2位/// </summary>private int decimalPointNumber;/// <summary>/// 允许输入的最小值,空值即代表当前类型的最小值/// </summary>private string minValue;/// <summary>/// 允许输入的最大值,空值即代表当前类型的最大值/// </summary>private string maxValue;[Browsable(true)][Category("NumberTextBox"), Description("指定控件数值输入的最小值"), DisplayName("最小值")]public string MinValue{get{return minValue;}set{if (string.IsNullOrWhiteSpace(value)){minValue = "";}else if (numberType == NumberType.Integer){if (int.TryParse(value, out int result)){minValue = result.ToString();}else{minValue = "";}}else if (numberType == NumberType.Long){if (long.TryParse(value, out long result)){minValue = result.ToString();}else{minValue = "";}}else if (numberType == NumberType.Float){if (float.TryParse(value, out float result)){minValue = result.ToString("F" + decimalPointNumber);}else{minValue = "";}}else if (numberType == NumberType.Double){if (double.TryParse(value, out double result)){minValue = result.ToString("F" + decimalPointNumber);}else{minValue = "";}}}}[Browsable(true)][Category("NumberTextBox"), Description("指定控件数值输入的最大值"), DisplayName("最大值")]public string MaxValue{get{return maxValue;}set{if (string.IsNullOrWhiteSpace(value)){maxValue = "";}else if (numberType == NumberType.Integer){if (int.TryParse(value, out int result)){maxValue = result.ToString();}else{maxValue = "";}}else if (numberType == NumberType.Long){if (long.TryParse(value, out long result)){maxValue = result.ToString();}else{maxValue = "";}}else if (numberType == NumberType.Float){if (float.TryParse(value, out float result)){maxValue = result.ToString("F" + decimalPointNumber);}else{maxValue = "";}}else if (numberType == NumberType.Double){if (double.TryParse(value, out double result)){maxValue = result.ToString("F" + decimalPointNumber);}else{maxValue = "";}}}}[Browsable(true)][Category("NumberTextBox"), Description("指定控件数值输入类型"), DisplayName("数值类型")]public NumberType NumberType { get => numberType; set => numberType = value; }[Browsable(true)][Category("NumberTextBox"), Description("当指定输入数值类型为小数时保留小数点位数"), DisplayName("小数点位数")][DefaultValue(2)]public int DecimalPointNumber { get => decimalPointNumber; set => decimalPointNumber = value; }protected override void OnTextChanged(EventArgs e){base.OnTextChanged(e);if (string.IsNullOrWhiteSpace(Text) || Text == "-")//输入负值{return;}switch (numberType){case NumberType.Integer:if (!int.TryParse(Text, out var i)){Text = Text.Substring(0, Text.Length - 1);SelectionStart = Text.Length;}break;case NumberType.Long:if (!long.TryParse(Text, out var l)){Text = Text.Substring(0, Text.Length - 1);SelectionStart = Text.Length;}break;case NumberType.Float:if (!float.TryParse(Text, out var f)){Text = Text.Substring(0, Text.Length - 1);SelectionStart = Text.Length;}break;case NumberType.Double:if (!double.TryParse(Text, out var d)){Text = Text.Substring(0, Text.Length - 1);SelectionStart = Text.Length;}break;}}protected override void OnKeyDown(KeyEventArgs e){base.OnKeyDown(e);if (e.KeyCode == Keys.Enter){VerifyThenFormatValue();}}protected override void OnLostFocus(EventArgs e){base.OnLostFocus(e);VerifyThenFormatValue();}private void VerifyThenFormatValue(){if (string.IsNullOrWhiteSpace(Text)){return;}if (numberType == NumberType.Float){Text = float.Parse(Text).ToString("F" + decimalPointNumber).ToString();}else if (numberType == NumberType.Double){Text = double.Parse(Text).ToString("F" + decimalPointNumber).ToString();}if (!string.IsNullOrWhiteSpace(minValue)){if (numberType == NumberType.Integer){if (int.Parse(Text) < int.Parse(minValue)){Text = minValue;}}else if (numberType == NumberType.Long){if (long.Parse(Text) < long.Parse(minValue)){Text = MinValue;}}else if (numberType == NumberType.Float){if (float.Parse(Text) < float.Parse(minValue)){Text = minValue;}}else if (numberType == NumberType.Double){if (double.Parse(Text) < double.Parse(minValue)){Text = minValue;}}}if (!string.IsNullOrWhiteSpace(maxValue)){if (numberType == NumberType.Integer){if (int.Parse(Text) > int.Parse(maxValue)){Text = maxValue;}}else if (numberType == NumberType.Long){if (long.Parse(Text) > long.Parse(maxValue)){Text = maxValue;}}else if (numberType == NumberType.Float){if (float.Parse(Text) > float.Parse(maxValue)){Text = maxValue;}}else if (numberType == NumberType.Double){if (double.Parse(Text) > double.Parse(maxValue)){Text = maxValue;}}}SelectionStart = Text.Length;}/// <summary>/// 复写Text,确保值是符合我们预设的类型/// </summary>public override string Text { get => base.Text; set {if (string.IsNullOrWhiteSpace(value)){base.Text = value;}else{if (numberType == NumberType.Integer){if (int.TryParse(value,out var result)){base.Text = result.ToString();}else{base.Text = "";}}if (numberType == NumberType.Long){if (long.TryParse(value, out var result)){base.Text = result.ToString();}else{base.Text = "";}}else if (numberType == NumberType.Float){if (float.TryParse(value, out var result)){base.Text = result.ToString("F"+decimalPointNumber);}else{base.Text = "";}}else if (numberType == NumberType.Double){if (double.TryParse(value, out var result)){base.Text = result.ToString("F" + decimalPointNumber);}else{base.Text = "";}}}               } }[Browsable(false)][DefaultValue(0)]public int IntValue{get{if (string.IsNullOrWhiteSpace(Text) || numberType != NumberType.Integer){return 0;}VerifyThenFormatValue();return int.Parse(Text);}set{Text = value.ToString();VerifyThenFormatValue();}}[Browsable(false)][DefaultValue(0)]public long LongValue {get{if (string.IsNullOrWhiteSpace(Text) || numberType != NumberType.Long){return 0;}VerifyThenFormatValue();return long.Parse(Text);}set{Text = value.ToString();VerifyThenFormatValue();}}[Browsable(false)][DefaultValue(0)]public float FloatValue{get{if (string.IsNullOrWhiteSpace(Text) || numberType != NumberType.Float){return 0;}VerifyThenFormatValue();return float.Parse(Text);}set{Text = value.ToString();VerifyThenFormatValue();}}[Browsable(false)][DefaultValue(0)]public double DoubleValue{get{if (string.IsNullOrWhiteSpace(Text) || numberType != NumberType.Double){return 0;}VerifyThenFormatValue();return double.Parse(Text);}set{Text = value.ToString();VerifyThenFormatValue();}}}public enum NumberType{Integer, Long, Float, Double}
}

该输入框可实现不同类型数值输入,包括整数,小数(可设置保留位数),还可以限制输入的最大最小值

使用方式:

  1. 拷贝代码到工程中,编译项目
  2. 打开工具箱,找到NumberTextBox拖到界面中即可
  3. 点击控件,可在属性栏中设置输入类型,最大最小值等相关属性
  4. 根据自己定义的输入类型调用IntValue等方法获取值即可

winform 自定义数值(数字)输入框相关推荐

  1. 一个简易的数字输入框组件

    数字输入框除有数字输入功能,还有两个快捷按钮,可以直接减1或者加1,除此之外,还可以设置初始值,最大值.最小值.在数值改变时候,触发一个自定义事件来通知父组件. 入口 <template> ...

  2. Vue.js学习笔记—input-number:实战:开发一个数字输入框组件

    参考<Vue,js>实战(梁灏编著) input-number:实战:开发一个数字输入框组件 git代码 index.html <!DOCTYPE html> <html ...

  3. 动手写个数字输入框1:input[type=number]的遗憾

    前言  最近在用Polymer封装纯数字的输入框,开发过程中发现不少坑,也有很多值得研究的地方.本系列打算分4篇来叙述这段可歌可泣的踩坑经历: <动手写个数字输入框1:input[type=nu ...

  4. value数字 vue_基于Vue开发数字输入框组件

    随着 vue 越来越火热, 相关组件库也非常多啦, 只用轮子怎么够, 还是要造起来!!! 1.概述 vue组件开发的api:props.events和slots 2.组件代码 效果: (1)index ...

  5. Element UI 数字输入框的实现

    方法一:添加正则校验 缺点:需要根据需要变更正则表达式 <template><el-form ref="formRef" :model="formDat ...

  6. jQuery EasyUI/TopJUI基本的数字输入框(保留两位小数,带前缀后缀...)

    jQuery EasyUI/TopJUI基本的数字输入框(保留两位小数,带前缀后缀...) numberbox(数值输入框) HTML required:必填字段,默认为false:prompt:显示 ...

  7. 数字输入框不能输入小数

    PM: 这个数字输入框不能输入小数 面对这个问题,有两种方法可以解决, 可以按照两种方法来解决这个问题, 具体现在哪种可以看需求处理 对小数四舍五入 给 Input 添加 precision 属性 & ...

  8. python使用正则表达式抽取字符串中最大数值数字

    python使用正则表达式抽取字符串中最大数值数字 #python使用正则表达式抽取字符串中最大数值数字 # Function to extract maximum numeric value fro ...

  9. MUI 里js动态添加数字输入框后,增加、减少按钮无效

    https://www.cnblogs.com/ssjf/p/10193652.html numbox 的自动初化是在 mui.ready 时完成的 mui 页面默认会自动初始化页面中的所有数字输入框 ...

最新文章

  1. 什么是区块链钱包?区块链钱包如何运作?
  2. 高并发Web服务的演变:节约系统内存和CPU
  3. hive集群部署以及beeline和hive
  4. raspberry nas_使用Raspberry Pi NAS托管您自己的云
  5. XAF 如何使用复合主键和复合外键
  6. 程序员该如在低代码和无代码开发中抉择?
  7. [ZZ].NET自动探索式测试工具——Pex
  8. C4D预设如何安装?
  9. 一、C语言[typedef、结构体、共用体、枚举体]
  10. Lux 安装以及使用
  11. ERP系统软件在国家电网公司中的应用
  12. L1-057 PTA使我精神焕发 (5 分)C语言
  13. 使用Office2003 VBA制作有倒计时功能的PPT
  14. 46.变分自编码器 VAE
  15. Websphere之HTTPS配置
  16. 计算机网络 本 课程导学,课程导学 - 操作系统原理 - 浙江大学网络教育精品资源共享课...
  17. camera calibration file head_camera.yaml not found
  18. 可免费商用的php,帝云CMS(DiYunCMS)–免费开源可商用的PHP万能建站程序
  19. 国仁网络资讯:视频号直播间添加购物商品详细流程步骤;直播必备干货。
  20. 如何用photoshop做24色环_怎么使用Photoshop制作24色环?

热门文章

  1. Privatejet.cn百万成交的卖家Chris,其他域名成交案例干货分享!
  2. 【C语言指针】一小时~你要是听不懂、我当场就把这个编译器......
  3. java打印三角形、等腰三角形、直角三角形
  4. 思科通配符(Cisco Wildcard Mask)
  5. JS实现导出网页表格为Excel
  6. 【SV】 $sformat和$formatf的用法
  7. 联合国发布全球山脉分布数据
  8. 计算机专业知识 2019pdf,2019《大学计算机基础》重点知识总结.pdf
  9. js的继承,我是搬运工
  10. 淘宝店铺要想获得最好的效果有效提供人气和交易量