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.pswp.cn/diannao/79706.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79706.shtml
英文地址,請注明出處:http://en.pswp.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…