国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何實現C# TextBox數字的輸入

開發 后端
c# textbox數字控件中限制只允許輸入數字常常用事后模式處理,本文向大家介紹下控件錄入操作的事前處理模式。希望本文對大家有所幫助。

C#旨在設計成為一種「簡單、現代、通用」,以及面向對象的程序設計語言。其中c# textbox數字輸入需要注意的一些情況容易被忽略,針對這一情況,筆者將在這篇文章中分享自己的一些經驗。

最近看到一些關于c# textbox數字中限制只允許輸入數字的博文,這類問題常常用事后處理模式:錄入字符結束后在控件離開(如Exit事件)或確認時進行判斷。本文探討控件錄入操作的事前處理模式:做錄入操作時屏蔽非數字字符。下面,結合筆者前段時間修改完善的開源數值文框TNumEditBox控件,介紹一個基于定制c# textbox數字控件的解決方法。

在定制的c# textbox數字控件中,如果只允許輸入數字,需要考慮如下三種情況:

正常按鍵輸入的字符,包括西文、中文字符等

通過鍵盤快捷鍵方式貼入的文本,即Ctrl+V操作

通過上下文關聯菜單的Mouse操作貼入的文本,即”粘貼“操作
在探討的同類文章中,多數只考慮了第1種情況,忽略得了第2、3種常見的操作。本文探討的處理方法核心思路是重寫事件OnKeyPress()和兩個方法 ProcessCmdKey()與WndProc(),并把Ctrl+V、關聯菜單的Paste操作統一到鍵盤錄入操作中,從而在 OnKeyPress()屏蔽掉非數字鍵。

1、重寫鍵盤事件OnKeyPress()

鍵盤輸入的字符可以通過重寫c# textbox數字控件的OnKeyPress()事件處理,見如下代碼:

  1. protected override void OnKeyPress(KeyPressEventArgs e)  // 屏蔽非數字鍵  
  2. {  
  3.     base.OnKeyPress(e);  
  4.     if (this.ReadOnly)  // 只讀, 不處理  
  5.     {  
  6.         return;  
  7.     }  
  8.             if ((int)e.KeyChar <= 32)  // 特殊鍵(含空格), 不處理  
  9.     {  
  10.         return;  
  11.     }  
  12.         if (!char.IsDigit(e.KeyChar))  // 非數字鍵, 放棄該輸入  
  13.     {  
  14.         e.Handled = true;  
  15.         return;  
  16.     }  

2、重寫命令鍵處理方法ProcessCmdKey()

可以在ProcessCmdKey()中捕獲快捷鍵Ctrl+V操作。首先要清除當前的選擇文本,然后讀取剪切板ClipBoard中的內容,最后通過模擬鍵盤輸入的方式”輸入“ClipBoard的內容。需要指出,在ProcessCmdKey()方法中不能使用靜態方法 SendKeys.Send(),但可以通過控件的WndProc()方法發送字符消息以達到模擬鍵盤錄入的目的。見如下代碼:

  1. protected override bool ProcessCmdKey(ref Message msg, Keys keyData)  
  2.   {  
  3.     if (keyData == (Keys)Shortcut.CtrlV)  // 快捷鍵 Ctrl+V 粘貼操作  
  4.     {  
  5.         this.ClearSelection();  
  6.         string text = Clipboard.GetText();  
  7.         for (int k = 0; k < text.Length; k++) // can not use SendKeys.  
  8.         {  
  9.             // 通過消息模擬鍵盤輸入, SendKeys.Send()靜態方法不行  
  10.             SendCharKey(text[k]);  
  11.         }  
  12.         return true;      
  13. }  
  14.     return base.ProcessCmdKey(ref msg, keyData);  
  1. private void SendCharKey(char c)  // 通過消息模擬鍵盤錄入  
  2. {  
  3.     Message msg = new Message();  
  4.     msg.HWnd = this.Handle;  
  5.     msg.Msg = WM_CHAR;  // 輸入鍵盤字符消息 0x0102  
  6.     msg.WParam = (IntPtr)c;  
  7.     msg.LParam = IntPtr.Zero;  
  8.     base.WndProc(ref msg);  


3、重寫消息處理方法WndProc()

可以在定制c# textbox數字控件中創建無內容的上下文菜單對象,從而屏蔽該菜單,方法是在定制控件的構造函數中增加如下代碼:

  1. public class CustomTextBox: TextBox  
  2. {  
  3.     // 創建無內容菜單對象, 等價屏蔽該控件的上下文菜單  
  4.     this.ContextMenu = new ConTextMenu();  
  5.   } 

由于上下文菜單的Paste操作對應Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕獲該消息,然后獲得剪切板 ClipBoard中的內容,最后通過SendKeys.Send()方法模擬鍵盤錄入操作。需要注意,這里不能調用前面ProcessCmdKey() 中模擬鍵盤輸入函數SendCharKey()。見如下代碼:

  1. protected override void WndProc(ref Message m)  // 捕獲Mouse的Paste消息  
  2. {  
  3.     if (m.Msg == WM_PASTE)  // 選擇上下文菜單的"粘貼"操作    {  
  4.         this.ClearSelection();  
  5.         SendKeys.Send(Clipboard.GetText());  // 模擬鍵盤輸入  
  6.     }  
  7.     else 
  8.     {  
  9.         base.WndProc(ref m);  
  10.     }  

4、消除選擇ClearSelection()、刪除字符DeleteText()

還必須分析前面代碼中的兩個函數:
ClearSelection()用以清除當前的選擇文本,即清除this.SelectedText
DeleteText()則刪除當前字符
需要指出其中的技巧,就是轉換Delete鍵操作為BackSpace操作。此外,函數DeleteText()還需要確定當前的this.SelectionStart值。具體代碼如下:

  1. private void ClearSelection() // 清除當前TextBox的選擇  
  2. {  
  3.     if (this.SelectionLength == 0)  
  4.     {  
  5.         return;  
  6.     }  
  7.     int selLength = this.SelectedText.Length;    this.SelectionStart += this.SelectedText.Length;  // 光標在選擇之后  
  8.     this.SelectionLength = 0;  
  9.     for (int k = 1; k <= selLength; k++)  
  10.     {  
  11.         this.DeleteText(Keys.Back);  
  12.     }  
  1. private void DeleteText(Keys key) // 刪除字符并計算SelectionStart值  
  2. {  
  3.     int selStart = this.SelectionStart;  
  4.     if (key == Keys.Delete)  // 轉換Delete操作為BackSpace操作  
  5.     {   
  6.        selStart += 1;  
  7.         if (selStart > base.Text.Length)  
  8.         {   
  9.            return;  
  10.         }  
  11.     }  
  12.     if (selStart == 0 || selStart >base.Text.Length)  // 不需要刪除  
  13.     {  
  14.         return;  
  15.     }  
  16.     if (selStart == 1 && base.Text.Length == 1)   
  17.    {  
  18.         base.Text = "";  
  19.         base.SelectionStart = 0;  
  20.     }  
  21.     else  // selStart > 0  
  22.     {  
  23.         base.Text = base.Text.Substring(0, selStart - 1) +  
  24.             base.Text.Substring(selStart, base.Text.Length - selStart);  
  25.         base.SelectionStart = selStart - 1;  
  26.     }  

5、結語

本文探討的是c# textbox數字控件輸入的事前處理模式,即在輸入字符的同時屏蔽非數字鍵。在實際應用中一般采取事后處理模式,即在c# textbox數字控件的Exit、Validate等事件中進行輸入后處理——離開該控時進行驗證。但事后處理模式有如下不足:

與數據源綁定時輸入非數字字符可能拋出異常,需要考慮異常捕獲

需要判斷數據并給出錯誤提示等處理

上述內容是從筆者的開源數值型數據編輯控件TNumEditBox中修改刪減而來的,該控件考慮的情況比只允許數字輸入要復雜得多,感興趣者可以參考并指正。需要指出,TNumEditBox的核心思路來自免費的Delphi控件PBNumEdit和開源的C#控件BANumEdit。作為回報,筆者也將TNumEditBox開源并發布到CodeProject。

本文來自:CSDN博客   作者:huihui

【編輯推薦】

  1. 編程語言排行榜:C語言當選08年年度編程語言
  2. C++標準委員會確定將concepts特性從C++0x中移除
  3. C#interface定義及使用淺析
  4. C#3.0新特性的介紹(自動屬性)
  5. C#HTTP文件傳輸的實現淺析
責任編輯:林琳 來源: CSDN博客
相關推薦

2009-09-08 22:58:00

c# textbox數

2009-09-09 13:18:10

C# TextBox滾C# TextBox

2009-09-02 17:29:10

C# TextBox換

2009-09-09 11:29:32

C# TextBox事

2009-09-09 12:55:59

C# TextBox事

2009-09-10 09:42:53

C# TextBox

2009-09-10 09:10:17

C# TextBox換

2009-09-09 13:31:15

C# TextBox

2009-09-10 10:22:05

C# TextBox

2009-09-09 21:56:29

2009-09-09 22:31:21

c# textbox失

2024-06-14 08:54:54

2009-08-19 14:29:33

C#代理

2009-08-26 15:09:57

C# Hook

2009-09-08 23:35:12

c# textbox失

2009-09-01 18:06:06

c#保存窗體狀態

2009-03-12 13:49:30

DataTemplatWPFC#

2009-09-10 17:48:05

C# button

2009-06-16 10:20:05

多繼承C#

2009-08-20 13:47:57

C#驗證輸入方法
點贊
收藏

51CTO技術棧公眾號

中文字幕av日韩精品| 国外成人免费在线播放 | 日本精品一区二区三区高清| 99色这里只有精品| 免费人成网站在线观看欧美高清| 国产精品三级| 怡红院av一区二区三区| 国产高清自拍99| 午夜成年人在线免费视频| 国产成人综合网| 久久久久久久久中文字幕| 超碰在线公开免费| 国产精品久久777777毛茸茸| 日韩在线观看高清| 俄罗斯xxxx性全过程| 激情丁香综合| 九九视频直播综合网| 欧美高清成人| 久久久另类综合| 久久涩涩网站| 色综合综合网| 欧美精品福利在线| 伊人久久久久久久久久久| 一本久道久久综合| 成人av免费| 久久视频在线| 在线欧美日韩精品| 国产h色视频在线观看| 五月天激情综合| 电影中文字幕一区二区| 色综合天天综合| aaa在线观看| 日韩欧美高清一区| 少妇视频一区| 亚洲人成亚洲人成在线观看| 精品国产一二| 亚洲+小说+欧美+激情+另类| 日韩视频中文字幕| 精品国产丝袜高跟鞋| 国产精品美日韩| 一级特黄性色生活片| 可以看av的网站久久看| 91九色国产视频| 亚洲另类av| 97视频在线观看成人| 2020国产精品小视频| 日韩一区二区三区视频在线观看| 黄色av网站在线看| 精品99一区二区三区| 日本电影在线观看| 亚洲天堂第一页| 欧美大片网站| 国产精品美女呻吟| 99久久99久久精品| 日韩一二三区在线观看| 激情久久五月| 亚洲亚裔videos黑人hd| 欧美wwww| 国产精品青青在线观看爽香蕉 | 久久久亚洲人| 真人做人试看60分钟免费| 91啪亚洲精品| 亚洲精品综合久久中文字幕| 成人日韩在线| 欧美精品国产精品日韩精品| 91综合久久| 久久婷婷国产综合尤物精品| 99热精品在线观看| 中国国产一级毛片| 欧美激情视频三区| 亚洲人妖av一区二区| 欧美国产激情| free性护士videos欧美| 亚洲国产一区二区三区高清| 国产免费视频| 国产福利久久精品| 欧美成人伊人久久综合网| 成人午夜在线免费| 你微笑时很美电视剧整集高清不卡| 国产无遮挡在线视频免费观看| 成人久久一区二区| 欧美α欧美αv大片| 91丨九色丨蝌蚪富婆spa| 蜜桃一区二区| 大菠萝精品导航| 97cao在线| 国产精品一 二 三| 亚洲国产精品久久久久秋霞影院| 日韩综合中文字幕| 欧美在线黄色| 国产一二区在线| 91精品啪在线观看麻豆免费 | 在线观看你懂得| 色综合91久久精品中文字幕| 黄色片在线看| 久久视频精品在线| 在线免费高清一区二区三区| 日韩福利视频在线| 亚洲加勒比久久88色综合| 一区二区三区午夜探花| 日本超碰在线观看| 亚洲欧美一区二区三区四区| 亚洲人成免费| 欧美最顶级a∨艳星| 亚洲不卡av不卡一区二区| 日韩av片在线看| 亚洲国产精品久久| 影音先锋亚洲电影| 免费看成年人视频在线观看| 久精品免费视频| 美女在线视频一区| 精品孕妇一区二区三区| 国产在线观看一区二区三区| 一区二区三区伦理| 毛片在线播放网址| 久久精品日产第一区二区三区| 亚洲电影观看| 久久九九99视频| 色呦呦在线播放| 亚洲最大av在线| 亚洲三级在线看| 少妇精品在线| 中文字幕无码精品亚洲35| 亚洲精品国产精品久久清纯直播 | 粉嫩91精品久久久久久久99蜜桃| 欧美日韩国产高清视频| 色综合一区二区三区| 国产成人精品999在线观看| av无码精品一区二区三区| 日韩人体视频一二区| 青草综合视频| 中文字幕国产一区二区| 久久精品噜噜噜成人av农村| 午夜小视频福利在线观看| 国产欧美精品日韩精品| 色婷婷激情一区二区三区| 欧美/亚洲一区| 中国动漫在线观看完整版免费| 传媒在线观看| 色综合一区二区日本韩国亚洲 | 欧美精品一区二区三区蜜臀| 欧美日韩一区二区免费在线观看| 在线中文字幕一区| 欧洲精品在线观看| 国产精品伦理一区二区| 国产综合精品| 欧美偷窥清纯综合图区| 水中色av综合| 亚洲国产日韩综合一区| 欧美日韩福利视频| 欧洲色大大久久| 26uuu国产一区二区三区| 日本久久精品| 美女网站在线看| 日韩a在线播放| 日韩精品最新在线观看| 国产成人鲁鲁免费视频a| 欧美精品一区二区三区一线天视频| 成人中文字幕合集| 国产模特精品视频久久久久| 女人丝袜激情亚洲| 日韩在线成人| 草民电影神马电影一区二区| 美腿丝袜亚洲图片| 中文字幕精品影院| 台湾色综合娱乐中文网| 91精品导航| 久久爱www成人| 亚洲综合网狠久久| 香蕉网站在线| 国产在线观看网站| 污视频在线观看网站| 玖草视频在线| 精品久久免费观看| 91久久精品一区二区别| 九九精品视频在线观看| 久久久午夜视频| 日韩免费观看在线观看| 欧美大学生性色视频| 91精品国产综合久久精品图片| 97精品久久久午夜一区二区三区| 日韩av电影天堂| 国产精品久久久久一区二区三区厕所 | 国产成人精品www牛牛影视| 99pao成人国产永久免费视频| 视频一区二区三区入口| 国产专区一区| 国产精品18久久久久久vr| 欧美日韩免费一区| 欧美日韩在线直播| 亚洲综合一区二区精品导航| 国产理论在线| 国产不卡在线| 香蕉久久夜色精品| 新版中文字幕在线资源| 国产在线观看91精品一区| 欧美一区二区三区公司| 精品精品视频| 欧美人xxx| 好男人看片在线观看免费观看国语 |