专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » textbox只允许数字:C# TextBox中只允许输入数字的解决方法 »正文

textbox只允许数字:C# TextBox中只允许输入数字的解决方法

来源: 发布时间:星期四, 2009年2月12日 浏览:185次 评论:0


最近看到些有关TextBox中限制只允许输入数字博文这类问题常常用事后处理模式:录入结束后在Control控件离开(如Exit事件)或确认时进行判断本文探讨Control控件录入操作事前处理模式:做录入操作时屏蔽非数字下面结合笔者前段时间修改完善开源数值文框TNumEditBoxControl控件介绍个基于定制TextBoxControl控件解决思路方法

在定制TextBoxControl控件中如果只允许输入数字需要考虑如下 3种情况:
正常按键输入包括西文、中文
通过键盘快捷键方式贴入文本即Ctrl+V操作
通过上下文关联菜单Mouse操作贴入文本即”粘贴“操作
在探讨同类文章中多数只考虑了第1种情况忽略得了第2、3种常见操作本文探讨处理思路方法核心思路是重写事件OnKeyPress和两个思路方法 ProcessCmdKey和WndProc并把Ctrl+V、关联菜单Paste操作统到键盘录入操作中从而在 _disibledevent=>2、重写命令键处理思路方法ProcessCmdKey

可以在ProcessCmdKey中捕获快捷键Ctrl+V操作首先要清除当前选择文本然后读取剪切板ClipBoard中内容最后通过模拟键盘输入方式”输入“ClipBoard内容需要指出在ProcessCmdKey思路方法中不能使用静态思路方法 SendKeys.Send但可以通过Control控件WndProc思路方法发送消息以达到模拟键盘录入见如下代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) // 捕获Ctrl+V{ (keyData (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作 { this.ClearSelection; text = Clipboard.GetText; for ( k = 0; k < text.Length; k) // can not use SendKeys.Send { // 通过消息模拟键盘输入, SendKeys.Send静态思路方法不行 SendCharKey(text[k]); } true; } base.ProcessCmdKey(ref msg, keyData);}private void SendCharKey(char c) // 通过消息模拟键盘录入{ Message msg = Message; msg.HWnd = this.Handle; msg.Msg = WM_CHAR; // 输入键盘消息 0x0102 msg.WParam = (IntPtr)c; msg.LParam = IntPtr.Zero; base.WndProc(ref msg);}
3、重写消息处理思路方法WndProc

可以在定制TextBoxControl控件中创建无内容上下文菜单对象从而屏蔽该菜单思路方法是在定制Control控件构造中增加如下代码:
public CustomTextBox: TextBox{ // 创建无内容菜单对象, 等价屏蔽该Control控件上下文菜单 this.ContextMenu = ConTextMenu; }由于上下文菜单Paste操作对应WindowsWM_PASTE消息于是可以在Control控件WndProc思路方法中捕获该消息然后获得剪切板 ClipBoard中内容最后通过SendKeys.Send思路方法模拟键盘录入操作需要注意这里不能前面ProcessCmdKey 中模拟键盘输入SendCharKey见如下代码:
protected override void WndProc(ref Message m) // 捕获MousePaste消息{ (m.Msg WM_PASTE) // 选择上下文菜单"粘贴"操作 { this.ClearSelection; SendKeys.Send(Clipboard.GetText); // 模拟键盘输入 } { base.WndProc(ref m); }}
4、消除选择ClearSelection、删除DeleteText

还必须分析前面代码中两个:
ClearSelection用以清除当前选择文本即清除this.SelectedText
DeleteText则删除当前
需要指出其中窍门技巧就是转换Delete键操作为BackSpace操作此外DeleteText还需要确定当前this.SelectionStart值具体代码如下:
private void ClearSelection // 清除当前TextBox选择{ (this.SelectionLength 0) { ; } selLength = this.SelectedText.Length; this.SelectionStart this.SelectedText.Length; // 光标在选择的后 this.SelectionLength = 0; for ( k = 1; k <= selLength; k) { this.DeleteText(Keys.Back); }}private void DeleteText(Keys key) // 删除并计算SelectionStart值{ selStart = this.SelectionStart; (key Keys.Delete) // 转换Delete操作为BackSpace操作 { selStart 1; (selStart > base.Text.Length) { ; } } (selStart 0 || selStart > base.Text.Length) // 不需要删除 { ; } (selStart 1 && base.Text.Length 1) { base.Text = ""; base.SelectionStart = 0; } // selStart > 0 { base.Text = base.Text.Sub(0, selStart - 1) + base.Text.Sub(selStart, base.Text.Length - selStart); base.SelectionStart = selStart - 1; }}
5、结语

本文探讨是TextBoxControl控件输入事前处理模式即在输入同时屏蔽非数字键在实际应用中般采取事后处理模式即在TextBoxControl控件Exit、Validate等事件中进行输入后处理——离开该控时进行验证但事后处理模式有如下不足:
和数据源绑定时输入非数字可能抛出异常需要考虑异常捕获
需要判断数据并给出提示等处理

上述内容是从笔者开源数值型数据编辑Control控件TNumEditBox中修改删减而来该Control控件考虑情况比只允许数字输入要复杂得多感兴趣者可以参考并指正需要指出TNumEditBox核心思路来自免费DelphiControl控件PBNumEdit和开源C#Control控件BANumEdit作为回报笔者也将TNumEditBox开源并发布到CodeProject

这里探讨是屏蔽非数字键输入显然可以推广到屏蔽其它特殊键如Tab和指定字母等
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: