textbox 输入限制

2024-03-19 02:58
文章标签 输入 限制 textbox

本文主要是介绍textbox 输入限制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication10
{
    /// <summary>
    /// 属性设定功能
    /// CusType:指定限制输入类型分为 整数、双精度、英文、英数
    /// IsFu:输入设定为整数、双精度时,是否可输入负号
    /// MaxValue:输入设定为整数、双精度时,数的最大值
    /// DotCount:输入设定为双精度时,小数点以后的位数
    /// IsEnterToTab:输入回来键时,是否变为输入tab键
    /// </summary>
    class TextBoxCustomized : TextBox
    {
        // 字符消息
        private const int WM_CHAR = 0x0102;
        // 上下文菜单"粘贴"消息
        private const int WM_PASTE = 0x0302;

        E_CUS_TYPE _cusType = E_CUS_TYPE.NONE;
        double _maxValue = 9999;
        bool _isFu = false;
        int _dotCount = 2;
        bool _isEnterToTab = false;


        //限制输入类型
        public enum E_CUS_TYPE
        {
            //无限制
            NONE,
            INT,
            DOUBLE,
            ENGLISH,
            ENGLIST_INT,
        }

        //限制输入类型
        public E_CUS_TYPE CusType
        {
            set
            {
                _cusType = value;
            }
            get
            {
                return _cusType;
            }
        }

        //数字最大值
        public double MaxValue
        {
            set
            {
                _maxValue = value;
            }
            get
            {
                return _maxValue;
            }
        }


        //可以输入负数
        public bool IsFu
        {
            set
            {
                _isFu = value;
            }
            get
            {
                return _isFu;
            }
        }

        //小数点后的位数
        public int DotCount
        {
            set
            {
                _dotCount = value;
            }
            get
            {
                return _dotCount;
            }
        }

        //enter 转为 父窗口的 tab
        public bool IsEnterToTab
        {
            set
            {
                _isEnterToTab = value;
            }
            get
            {
                return _isEnterToTab;
            }
        }


        public TextBoxCustomized()
        {
            //去掉菜单
            if (ContextMenu == null)
            {
                ContextMenu = new ContextMenu();
            }
        }

        //按键
        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            //判断 keypress 是否符合要求
            string text = this.Text;
            
            if (IsCheck(e.KeyChar, this.SelectionStart, this.Text, _maxValue))
            {
                base.OnKeyPress(e);
            }
            else
            {
                e.Handled = true;
            }
        }

        //键被按下 delete 转为 backspace
        protected override void OnKeyDown(KeyEventArgs e)
        {
            //delete 转为 backspace
            if (e.KeyCode == Keys.Delete)
            {
                if (this.SelectionStart < this.Text.Count())
                {
                    if (IsCheck('\b', this.SelectionStart + 1, this.Text, _maxValue))
                    {
                        return;
                    }
                }

                e.Handled = true;
            }

            //enter 转为 父窗口的 tab 认为当前窗口为活动窗口
            if (_isEnterToTab && e.KeyCode == Keys.Enter)
            {
                SendKeys.Send("{Tab}");
                return;
            }

            base.OnKeyDown(e);
        }

        //control + V 过虑
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys)Shortcut.CtrlV)
            {
                string text = Clipboard.GetText();

                foreach (var key in text)
                {
                    // 通过消息模拟键盘输入, SendKeys.Send()静态方法不行
                    SendCharKey(key);
                }
            }

            return base.ProcessCmdKey(ref msg, keyData);
        }

        protected override void WndProc(ref Message m)
        {
            // 选择上下文菜单的"粘贴"操作
            if (m.Msg == WM_PASTE)  
            {
                // 模拟键盘输入
                SendKeys.Send(Clipboard.GetText());
            }
            else
            {
                base.WndProc(ref m);
            }

        }

        // 通过消息模拟键盘录入
        private void SendCharKey(char c)  
        {
            Message msg = new Message();

            msg.HWnd = this.Handle;
            // 输入键盘字符消息WM_CHAR
            msg.Msg = WM_CHAR;  
            msg.WParam = (IntPtr)c;
            msg.LParam = IntPtr.Zero;

            base.WndProc(ref msg);
        }


        private bool IsCheck(char key, int postion, string text, double maxValue)
        {
            switch (_cusType)
            {
                case E_CUS_TYPE.INT:
                    return IsInt(key, postion, text, maxValue, _isFu);
                case E_CUS_TYPE.DOUBLE:
                    return IsDouble(key, postion, text, maxValue, _isFu, _dotCount);
                case E_CUS_TYPE.ENGLISH:
                    return IsEnglish(key);
                case E_CUS_TYPE.ENGLIST_INT:
                    return IsEnglishInt(key);
                default:
                    break;
            }

            return true;
        }

        //录入的是数字
        private bool IsInt(char key, int postion, string text, double maxValue, bool isFu)
        {
            //删除 可以
            if ('\b' == key)
            {
                return true;
            }

            //第一位为负
            if (isFu && key == '-' && postion == 0)
            {
                return true;
            }
            //负号前不能有数字
            if (text.Length >= 1 && text[0] == '-' && postion == 0)
            {
                return false;
            }


            //去掉负号,两个字符以上,第一个不能为0
            //输入的数据为0
            if (text.Length >= 1 && (key == '0'))
            {
                //有负号
                if (text[0] == '-')
                {
                    if (text.Length >= 2)
                    {
                        //第二个不能为“0”
                        if (postion == 1)
                        {
                            return false;
                        }

                        //第三个为0时,第一个不能是0
                        if (postion == 2 && text[1] == '0')
                        {
                            return false;
                        }
                    }
                }
                //无负号
                else
                {
                    //第一个不能为“0”
                    if (postion == 0)
                    {
                        return false;
                    }

                    //第二个为0时,第一个不能是0
                    if (postion == 1 && text[0] == '0')
                    {
                        return false;
                    }
                }
            }

            if (Char.IsNumber(key))
            {
                string temp = text;
                temp = temp.Insert(postion, key.ToString());
                //不能大于maxValue
                if (Convert.ToDouble(temp) > maxValue)
                {
                    return false;
                }
                return true;
            }

            return false;
        }


        //录入的是浮点数 是否通过输入限制
        static public bool IsDouble(char key, int postion, string text, double maxValue, bool isFu, int dotCount)
        {
            //删除 可以
            if ('\b' == key)
            {
                StringBuilder temp = new StringBuilder(text);

                //内容为空可以
                if (temp.ToString().Count() == 0)
                {
                    return true;
                }

                temp.Remove(postion - 1, 1);

                //去掉内容后,内容为空可以
                if (temp.ToString().Count() == 0)
                {
                    return true;
                }
                //去掉后内容为“-”,可以
                if (temp.ToString() == "-")
                {
                    return true;
                }

                //不能大于maxValue
                if (Convert.ToDouble(temp.ToString()) > maxValue)
                {
                    return false;
                }

                return true;
            }

            //小数点后的位数
            string tempDot = text;
            tempDot = tempDot.Insert(postion, key.ToString());
            var dotArr = tempDot.Split(new char[] { '.' });
            if (dotArr.Count() == 2 && dotArr[1].Count() > dotCount)
            {
                return false;
            }

            //第一位为负
            if (isFu && key == '-' && postion == 0)
            {
                return true;
            }
            //负号前不能有数字
            if (text.Length >= 1 && text[0] == '-' && postion == 0)
            {
                return false;
            }


            //仅能有一个小数点 且不在第一位
            if (key == '.' && postion != 0)
            {
                //已有一个“.” 不可以,“.”前不能是“-”
                if (text.Contains(".") || text[postion - 1] == '-')
                {
                    return false;
                }
                else
                {
                    return true;
                }                
            }
            //去掉负号,两个字符以上,第一个不能为0
            //输入的数据为0
            if (text.Length >= 1 && (key == '0'))
            {
                //有负号
                if (text[0] == '-')
                {
                    if (text.Length >= 2)
                    {
                        //第二个不能为“0”
                        if (postion == 1)
                        {
                            return false;
                        }

                        //第三个为0时,第一个不能是0
                        if (postion == 2 && text[1] == '0')
                        {
                            return false;
                        }
                    }
                }
                //无负号
                else
                {
                    //第一个不能为“0”
                    if (postion == 0)
                    {
                        return false;
                    }

                    //第二个为0时,第一个不能是0
                    if (postion == 1 && text[0] == '0')
                    {
                        return false;
                    }
                }
            }

            //数字 可以
            if (Char.IsNumber(key))
            {
                string temp = text;
                temp = temp.Insert(postion, key.ToString());
                //不能大于maxValue
                if (Convert.ToDouble(temp) > maxValue)
                {
                    return false;
                }

                return true;
            }

            return false;
        }


        //录入的是英文
        private bool IsEnglish(char key)
        {
            //删除 可以
            if ('\b' == key)
            {
                return true;
            }

            //英文 可以
            if (Char.IsLetter(key))
            {
                return true;
            }

            return false;
        }


        //录入的是英文或数字
        private bool IsEnglishInt(char key)
        {
            //删除 可以
            if ('\b' == key)
            {
                return true;
            }

            //英文或数字可以
            if (Char.IsLetter(key) || Char.IsNumber(key))
            {
                return true;
            }

            return false;
        }
    }
}


这篇关于textbox 输入限制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/824566

相关文章

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

当你输入一个网址后都发生什么

原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/  作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

在 Qt Creator 中,输入 /** 并按下Enter可以自动生成 Doxygen 风格的注释

在 Qt Creator 中,当你输入 /** 时,确实会自动补全标准的 Doxygen 风格注释。这是因为 Qt Creator 支持 Doxygen 以及类似的文档注释风格,并且提供了代码自动补全功能。 以下是如何在 Qt Creator 中使用和显示这些注释标记的步骤: 1. 自动补全 Doxygen 风格注释 在 Qt Creator 中,你可以这样操作: 在你的代码中,将光标放在

Java应用对接pinpoint监控工具的时候,应用名称长度超出限制而导致接入失败

一、背景 java应用需要接入pinpoint,同一个虚拟机上的其他应用接入成功,唯独本应用不行。 首先排除是pinpoint agent的问题,因为其他应用都正常。 然后,我就对比二者的启动脚本。 -javaagent:/opt/pinpoint/pinpoint-bootstrap.jar -Dpinpoint.agentId=DA301004_17 -Dpinpoint.applic