winform 自定义数值(数字)输入框

博客介绍了如何通过C#自定义一个数值输入框控件,支持整数、小数输入,并能设置保留小数点位数及限定最大最小值。控件在输入时实时验证合法性,提供IntValue、LongValue、FloatValue、DoubleValue等属性方便获取对应类型的数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近写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等方法获取值即可
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值