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

相关文章

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Nginx 413修改上传文件大小限制的方法详解

《Nginx413修改上传文件大小限制的方法详解》在使用Nginx作为Web服务器时,有时会遇到客户端尝试上传大文件时返回​​413RequestEntityTooLarge​​... 目录1. 理解 ​​413 Request Entity Too Large​​ 错误2. 修改 Nginx 配置2.1

Windows系统宽带限制如何解除?

《Windows系统宽带限制如何解除?》有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文就跟大家一起来看看Windows系统解除网络限制的操作方法吧... 有不少用户反映电脑网速慢得情况,可能是宽带速度被限制的原因,只需解除限制即可,具体该如何操作呢?本文

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

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

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