C# WinForm窗口TextBox控件只能输入数字(包括小数)并且恢复Ctrl+C复制和Ctrl+V粘贴功能

1. 前言

最近在写定GPS定位时,经纬度是用的double类型,并且经纬度的要求是小数点后最少6位,多了能达到17位,又遇到了常用的TextBox控件只能输入数字、小数的功能,因为有一年多没有写程序,现在再来写这些感觉已经忘记的差不多了,这次干脆把功能进行扩展,写到这里以作记录,并分享与大家。

2. 功能

(1)TextBox文本框只能输入0-9和小数点以及BackSpace删除键。
(2)文本框小数点只能有一位。
(3)文本框内第一位如果直接输入小数点,会自动在其前面补0,形成“0.”开头的格式。
(4)因为TexbBox控件增加了我们自己“只能输入数字小数点和删除键功能”的KeyPress事件,会导致TextBox控件的Ctrl+C和Ctrl+V功能失效,只能用鼠标来执行复制粘贴,所以此次通过TextBox控件的KeyDown事件进行了修复,文本框的复制和粘贴功能又恢复正常。
(5)对文本框Ctrl+V粘贴剪切板的内容进行了处理,把剪切板内非数字和小数点部分过滤掉了。也就是说你复制了含有字母、汉字、空格、特殊符号等非数字字符,粘贴到文本框时会把它们去掉,只留下含有数字的部分。
(6)其余对文本框选中内容的操作,我们处理的跟Windows系统操作方法一样。

3. 程序代码

        /// <summary>/// 只能输入数字、小数点、删除键,并且第1位输入小数点,自动在前面补0,形成"0."格式/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void NumPointKeypress(object sender, KeyPressEventArgs e){//除了数字、小数点、删除键的其他键,程序不输出if (!((e.KeyChar >= '0' && e.KeyChar <= '9') || e.KeyChar == '.' || e.KeyChar == (char)Keys.Back)){e.Handled = true;}//按键是小数点if (e.KeyChar == '.'){//获取当前文本框对象TextBox textbox = sender as TextBox;//文本框的文本已经有小数点if (textbox.Text.IndexOf('.') >= 0){//文本框选定的文本包括小数点,再次输入小数点时就把选定的内容删除并换成小数点if (textbox.SelectedText.Contains(".")){//选定带小数点文本的起始位置(索引)int Index = textbox.SelectionStart;//从第一位开始选定带小数点的文本,输入小数点时直接在前面补0,形成"0."开头的文本,光标置于小数点后if (Index == 0){textbox.Text = textbox.Text.Remove(Index, textbox.SelectionLength).Insert(Index, "0.");textbox.SelectionStart = Index + 2;}else//选定小数点的文本是起始位置在第一位之后,再次输入小数点直接将选定内容替换成小数点,光标置于小数点后{textbox.Text = textbox.Text.Remove(Index, textbox.SelectionLength).Insert(Index, ".");textbox.SelectionStart = Index + 1;}textbox.SelectionLength = 0;// 确保没有文本被选中}e.Handled = true;}else if (string.IsNullOrEmpty(textbox.Text))//文本框不含小数点,并且文本框内容为空{//方法1:直接将小数点写入文本起始位置,格式"0.",按键不输出//textbox.Text = "0.";//textbox.SelectionStart = 2;  //光标在文本框中第三个字符处(位置索引为2)//textbox.SelectionLength = 0; // 确保没有文本被选中//e.Handled = true;//方法2:不写入小数点,在文本起始位置写入0,按键输出小数点textbox.Text = "0";textbox.SelectionStart = 1;  //光标在文本框中第二个字符处(位置索引为2)textbox.SelectionLength = 0; // 确保没有文本被选中}else if (!string.IsNullOrEmpty(textbox.Text))//文本框不含小数点,并且文本框已经有内容{/* * 光标位于文本框最前面,用一条语句解决下面两种情况:* 第一种情况,有选定内容,直接删除后插入"0",按键再输出小数点,* 第二种情况,没有选定内容,下面语句text.Text.Remove(0,0)相当于没有替换,*             也是直接在文本最前面插入了"0",按键再输出小数点,*/if (textbox.SelectionStart == 0){textbox.Text = textbox.Text.Remove(0, textbox.SelectionLength).Insert(0, "0");textbox.SelectionStart = 1;  //光标置于小数点后textbox.SelectionLength = 0; // 确保没有文本被选中}//光标不在文本框最前面,在其他任意位置,文本内容选中与不选中,都会按系统自己的方式插入小数点。}}}/// <summary>/// 允许文本框复制、粘贴/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void NumPointKeydown(object sender, KeyEventArgs e){TextBox textbox = sender as TextBox;if (e.KeyData == (Keys.Control | Keys.C)){Clipboard.SetDataObject(textbox.SelectedText);}if (e.KeyData == (Keys.Control | Keys.V)){//文本框中的文本未选中情况下,把剪切板中的插入光标处if (textbox.SelectionLength == 0){//将原文本框中的文本与插入剪切板中的字符进行过滤(如果剪切板中有非数字字符,多余一位的小数点都将去除)textbox.Text = FilterString(textbox.Text.Insert(textbox.SelectionStart, Clipboard.GetText()));}else//文本在选中情况下,删除掉选中的文本,再把剪切板中的插入此处{int Index = textbox.SelectionStart;textbox.Text = textbox.Text.Remove(Index, textbox.SelectionLength).Insert(Index, Clipboard.GetText());//将原文本框中的文本与插入剪切板中的字符进行过滤(如果剪切板中有非数字字符,多余一位的小数点都将去除)textbox.Text = FilterString(textbox.Text);}//粘贴完成后,光标置于文本最后textbox.SelectionStart = textbox.Text.Length;}}/// <summary>/// 把剪切板中的英文、汉字、特殊字符等非数字字符过滤掉/// 如果存在多个小数点,只留第一位小数点/// </summary>/// <param name="clipboardText">剪切板组合的内容</param>/// <returns>返回整数或浮点数字符串</returns>private string FilterString(string clipboardText){// 匹配浮点数或整数string pattern = @"[+-]?(\d+(\.\d*)?|\.\d+)";System.Text.RegularExpressions.MatchCollection matches = System.Text.RegularExpressions.Regex.Matches(clipboardText, pattern);string Filterstring = string.Empty;foreach (System.Text.RegularExpressions.Match match in matches){Filterstring += match.Value;}//如果存在多个小数点,留下第一个小数点,其他的都删除int PointCounts = Filterstring.Where(p => p == '.').Count();if (PointCounts >= 2){for (int i = 0; i < PointCounts - 1; i++){Filterstring = Filterstring.Remove(Filterstring.LastIndexOf('.'), 1);}}//过滤后不存在数字部分则返回字符0if (string.IsNullOrEmpty(Filterstring))return "0";else{//过滤后第一位是小数点,则在其前面加0if (Filterstring.FirstOrDefault() == '.')Filterstring = "0" + Filterstring;return Filterstring;}}

注意:如果在Ctrl+V粘贴时不需要对剪切板中的内容进行过滤,而是直接要使用剪切板的内容,可以在NumPointKeydown()事件中使用 textbox.Text = Clipboard.GetText(),就不需要再调用FilterString()字符过滤函数了。

4. 调用

可以在窗口文件的构造函数中直接调用,也可以在窗口载入事件Load()中调用,以窗口构造函数为例。

        public Form1(){InitializeComponent();//绑定事件以下事件://1、文本框只能输入数字、小数点、删除键的事件textBox1.KeyPress += NumPointKeypress;textBox2.KeyPress += NumPointKeypress;//2、文本框允许复制、粘贴textBox1.KeyDown += NumPointKeydown;textBox2.KeyDown += NumPointKeydown;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79706.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL数据库】数据类型

目录 1&#xff0c;数据类型分类 2&#xff0c;bit类型 3&#xff0c;小数类型 3-1&#xff0c;float/double类型 3-2&#xff0c;decimal类型 4&#xff0c;字符串类型 4-1&#xff0c;char 4-2&#xff0c;varchar 5&#xff0c;日期和时间类型 6&#xff0c;enum和…

Spark-SQL核心编程2

路径问题 相对路径与绝对路径&#xff1a;建议使用绝对路径&#xff0c;避免复制粘贴导致的错误&#xff0c;必要时将斜杠改为双反斜杠。 数据处理与展示 SQL 风格语法&#xff1a;创建临时视图并使用 SQL 风格语法查询数据。 DSL 风格语法&#xff1a;使用 DSL 风格语法查询…

pandas库详解

CONTENT 基本数据结构SeriesDataFrame 数据读取与写入读取 CSV 文件写入 CSV 文件 数据清洗处理缺失值数据类型转换 数据操作索引与切片数据合并数据分组与聚合 数据可视化 基本数据结构 Series Series 属于一维标记数组&#xff0c;由一组数据和对应的索引构成。 import pa…

黑马商城(五)微服务保护和分布式事务

一、雪崩问题 二、雪崩-解决方案&#xff08;服务保护方案&#xff09; 请求限流&#xff1a; 线程隔离&#xff1a; 服务熔断&#xff1a; 服务保护组件&#xff1a; 三、Sentinel 引入依赖&#xff1a; <!--sentinel--> <dependency><groupId>com.aliba…

洛谷P1312 [NOIP 2011 提高组] Mayan 游戏

题目 #算法/进阶搜索 思路: 根据题意,我们可以知道,这题只能枚举,剪枝,因此,我们考虑如何枚举,剪枝. 首先,我们要定义下降函数down(),使得小木块右移时,能够下降到最低处,其次,我们还需要写出判断函数,判断矩阵内是否有小木块没被消除.另外,我们还需要消除函数,将矩阵内三个相连…

基于Redis的3种分布式ID生成策略

在分布式系统设计中&#xff0c;全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进&#xff0c;传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。 Redis具备高性能、原子操作及简单易用的特性&…

Spotlight on Mysql详细介绍

1. 版本............................................................................................................................................1 2. 使用介绍...............................................................................................…

背包 DP 详解

文章目录 背包DP01 背包完全背包多重背包二进制优化单调队列优化 小结 背包DP 背包 DP&#xff0c;说白了就是往一个背包里扔东西&#xff0c;求最后的最大价值是多少&#xff0c;一般分为了三种&#xff1a;01 背包、完全背包和多重背包。而 01 背包则是一切的基础。 01 背包…

二级评论列表-Java实现

二级评论列表是很常见的功能&#xff0c;文章记录了新手用Java实现的具体逻辑。 整体实现逻辑是先用2个sql&#xff0c;分别查出两层数据。然后用java在service中实现数据组装&#xff0c;返给前端。这种实现思路好处是SQL简洁&#xff0c;逻辑分明&#xff0c;便于维护。 一…

快速入手-基于python和opencv的人脸检测

1、安装库 pip install opencv-python 如果下载比较卡的话&#xff0c;指向国内下载地址&#xff1a; pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 2、下载源码 https://opencv.org/ windows11对应的版本下载&#xff1a; https://pan.baidu…

GitLab本地安装指南

当前GitLab的最新版是v17.10&#xff0c;安装地址&#xff1a;https://about.gitlab.com/install/。当然国内也可以安装极狐GitLab版本&#xff0c;极狐GitLab 是 GitLab 中国发行版&#xff08;JH&#xff09;。极狐GitLab支持龙蜥&#xff0c;欧拉等国内的操作系统平台。安装…

OpenCv高阶(六)——图像的透视变换

目录 一、透视变换的定义与作用 二、透视变换的过程 三、OpenCV 中的透视变换函数 1. cv2.getPerspectiveTransform(src, dst) 2. cv2.warpPerspective(src, H, dsize, dstNone, flagscv2.INTER_LINEAR, borderModecv2.BORDER_CONSTANT, borderValue0) 四、文档扫描校正&a…

资源-又在网上淘到金了

前言&#xff1a; 本期再分享网上冲浪发现的特效/动画/视频资源网站。 一、基本介绍&#xff1a; mantissa.xyz&#xff0c;about作者介绍为&#xff1a;Midge “Mantissa” Sinnaeve &#xff08;米奇辛纳夫&#xff09;是一位屡获殊荣的艺术家和导演&#xff0c;提供动画、…

Linux疑难杂惑 | 云服务器重装系统后vscode无法远程连接的问题

报错原因&#xff1a;本地的known_hosts文件记录服务器信息与现服务器的信息冲突了&#xff0c;导致连接失败。 解决方法&#xff1a;找到本地的known_hosts文件&#xff0c;把里面的所有东西删除后保存就好了。 该文件的路径可以在报错中寻找&#xff1a;比如我的路径就是&a…

FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)

本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…

【音视频】音视频FLV合成实战

FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流&#xff0c;并将它们编码和封装输出到输出⽂件&#xff0c;输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作&#xff1a; avformat_write_header &#xff1a; 写⽂件…

全链路开源数据平台技术选型指南:六大实战工具链解析

在数字化转型加速的背景下&#xff0c;开源技术正重塑数据平台的技术格局。本文深度解析数据平台的全链路架构&#xff0c;精选六款兼具创新性与实用性的开源工具&#xff0c;涵盖数据编排、治理、实时计算、联邦查询等核心场景&#xff0c;为企业构建云原生数据架构提供可落地…

JAVA设计模式——(1)适配器模式

JAVA设计模式——&#xff08;1&#xff09;适配器模式 目的理解实现优势 目的 将一个类的接口变换成客户端所期待的另一种接口&#xff0c;从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。 理解 可以想象成一个国标的插头&#xff0c;结果插座是德标的&…

Qt C++ 解析和处理 XML 文件示例

使用 Qt C 解析和处理 XML 文件 以下是使用 Qt C 实现 XML 文件处理的几种方法&#xff0c;包括解析、创建和修改 XML 文件。 1. 使用 QXmlStreamReader (推荐方式) #include <QFile> #include <QXmlStreamReader> #include <QDebug>void parseXmlWithStr…

坐标上海,20~40K的面试强度

继续分享最新的面经&#xff0c;面试的岗位是上海某公司的Golang开发岗&#xff0c;给的薪资范围是20~40K&#xff0c;对mongodb要求熟练掌握&#xff0c;所以面试过程中对于mongodb也问的比较多。 下面是我整理好的面经&#xff08;去除了项目相关的问题&#xff09;&#xf…