c#中如何控制文本框中输入字符的范围
3个回答
展开全部
在定制的TextBox控件中,如果只允许输入数字,需要考虑如下三种情况:
正常按键输入的字符,包括西文、中文字符等
通过键盘快捷键方式贴入的文本,即Ctrl+V操作
通过上下文关联菜单的Mouse操作贴入的文本,即”粘贴“操作
在探讨的同类文章中,多数只考虑了第1种情况,忽略得了第2、3种常见的操作。本文探讨的处理方法核心思路是重写事件OnKeyPress()和两个方法 ProcessCmdKey()与WndProc(),并把Ctrl+V、关联菜单的Paste操作统一到键盘录入操作中,从而在 OnKeyPress()屏蔽掉非数字键。
1、重写键盘事件OnKeyPress()
键盘输入的字符可以通过重写TextBox控件的OnKeyPress()事件处理,见如下代码:
protected override void OnKeyPress(KeyPressEventArgs e) // 屏蔽非数字键{ base.OnKeyPress(e); if (this.ReadOnly) // 只读, 不处理 { return; } if ((int)e.KeyChar <= 32) // 特殊键(含空格), 不处理 { return; } if (!char.IsDigit(e.KeyChar)) // 非数字键, 放弃该输入 { e.Handled = true; return; }}
2、重写命令键处理方法ProcessCmdKey()
可以在ProcessCmdKey()中捕获快捷键Ctrl+V操作。首先要清除当前的选择文本,然后读取剪切板ClipBoard中的内容,最后通过模拟键盘输入的方式”输入“ClipBoard的内容。需要指出,在ProcessCmdKey()方法中不能使用静态方法 SendKeys.Send(),但可以通过控件的WndProc()方法发送字符消息以达到模拟键盘录入的目的。见如下代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) // 捕获Ctrl+V{ if (keyData == (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作 { this.ClearSelection(); string text = Clipboard.GetText(); for (int k = 0; k < text.Length; k++) // can not use SendKeys.Send { // 通过消息模拟键盘输入, SendKeys.Send()静态方法不行 SendCharKey(text[k]); } return true; } return base.ProcessCmdKey(ref msg, keyData);}private void SendCharKey(char c) // 通过消息模拟键盘录入{ Message msg = new Message(); msg.HWnd = this.Handle; msg.Msg = WM_CHAR; // 输入键盘字符消息 0x0102 msg.WParam = (IntPtr)c; msg.LParam = IntPtr.Zero; base.WndProc(ref msg);}
3、重写消息处理方法WndProc()
可以在定制TextBox控件中创建无内容的上下文菜单对象,从而屏蔽该菜单,方法是在定制控件的构造函数中增加如下代码:
public class CustomTextBox: TextBox{ // 创建无内容菜单对象, 等价屏蔽该控件的上下文菜单 this.ContextMenu = new ConTextMenu(); }由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板 ClipBoard中的内容,最后通过SendKeys.Send()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey() 中模拟键盘输入函数SendCharKey()。见如下代码:
protected override void WndProc(ref Message m) // 捕获Mouse的Paste消息{ if (m.Msg == WM_PASTE) // 选择上下文菜单的"粘贴"操作 { this.ClearSelection(); SendKeys.Send(Clipboard.GetText()); // 模拟键盘输入 } else { base.WndProc(ref m); }}
4、消除选择ClearSelection()、删除字符DeleteText()
还必须分析前面代码中的两个函数:
ClearSelection()用以清除当前的选择文本,即清除this.SelectedText
DeleteText()则删除当前字符
需要指出其中的技巧,就是转换Delete键操作为BackSpace操作。此外,函数DeleteText()还需要确定当前的this.SelectionStart值。具体代码如下:
private void ClearSelection() // 清除当前TextBox的选择{ if (this.SelectionLength == 0) { return; } int selLength = this.SelectedText.Length; this.SelectionStart += this.SelectedText.Length; // 光标在选择之后 this.SelectionLength = 0; for (int k = 1; k <= selLength; k++) { this.DeleteText(Keys.Back); }}private void DeleteText(Keys key) // 删除字符并计算SelectionStart值{ int selStart = this.SelectionStart; if (key == Keys.Delete) // 转换Delete操作为BackSpace操作 { selStart += 1; if (selStart > base.Text.Length) { return; } } if (selStart == 0 || selStart > base.Text.Length) // 不需要删除 { return; } if (selStart == 1 && base.Text.Length == 1) { base.Text = ""; base.SelectionStart = 0; } else // selStart > 0 { base.Text = base.Text.Substring(0, selStart - 1) + base.Text.Substring(selStart, base.Text.Length - selStart); base.SelectionStart = selStart - 1; }}
5、结语
本文探讨的是TextBox控件输入的事前处理模式,即在输入字符的同时屏蔽非数字键。在实际应用中一般采取事后处理模式,即在TextBox控件的Exit、Validate等事件中进行输入后处理——离开该控时进行验证。但事后处理模式有如下不足:
与数据源绑定时输入非数字字符可能抛出异常,需要考虑异常捕获
需要判断数据并给出错误提示等处理
正常按键输入的字符,包括西文、中文字符等
通过键盘快捷键方式贴入的文本,即Ctrl+V操作
通过上下文关联菜单的Mouse操作贴入的文本,即”粘贴“操作
在探讨的同类文章中,多数只考虑了第1种情况,忽略得了第2、3种常见的操作。本文探讨的处理方法核心思路是重写事件OnKeyPress()和两个方法 ProcessCmdKey()与WndProc(),并把Ctrl+V、关联菜单的Paste操作统一到键盘录入操作中,从而在 OnKeyPress()屏蔽掉非数字键。
1、重写键盘事件OnKeyPress()
键盘输入的字符可以通过重写TextBox控件的OnKeyPress()事件处理,见如下代码:
protected override void OnKeyPress(KeyPressEventArgs e) // 屏蔽非数字键{ base.OnKeyPress(e); if (this.ReadOnly) // 只读, 不处理 { return; } if ((int)e.KeyChar <= 32) // 特殊键(含空格), 不处理 { return; } if (!char.IsDigit(e.KeyChar)) // 非数字键, 放弃该输入 { e.Handled = true; return; }}
2、重写命令键处理方法ProcessCmdKey()
可以在ProcessCmdKey()中捕获快捷键Ctrl+V操作。首先要清除当前的选择文本,然后读取剪切板ClipBoard中的内容,最后通过模拟键盘输入的方式”输入“ClipBoard的内容。需要指出,在ProcessCmdKey()方法中不能使用静态方法 SendKeys.Send(),但可以通过控件的WndProc()方法发送字符消息以达到模拟键盘录入的目的。见如下代码:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) // 捕获Ctrl+V{ if (keyData == (Keys)Shortcut.CtrlV) // 快捷键 Ctrl+V 粘贴操作 { this.ClearSelection(); string text = Clipboard.GetText(); for (int k = 0; k < text.Length; k++) // can not use SendKeys.Send { // 通过消息模拟键盘输入, SendKeys.Send()静态方法不行 SendCharKey(text[k]); } return true; } return base.ProcessCmdKey(ref msg, keyData);}private void SendCharKey(char c) // 通过消息模拟键盘录入{ Message msg = new Message(); msg.HWnd = this.Handle; msg.Msg = WM_CHAR; // 输入键盘字符消息 0x0102 msg.WParam = (IntPtr)c; msg.LParam = IntPtr.Zero; base.WndProc(ref msg);}
3、重写消息处理方法WndProc()
可以在定制TextBox控件中创建无内容的上下文菜单对象,从而屏蔽该菜单,方法是在定制控件的构造函数中增加如下代码:
public class CustomTextBox: TextBox{ // 创建无内容菜单对象, 等价屏蔽该控件的上下文菜单 this.ContextMenu = new ConTextMenu(); }由于上下文菜单的Paste操作对应Windows的WM_PASTE消息,于是可以在控件的WndProc()方法中捕获该消息,然后获得剪切板 ClipBoard中的内容,最后通过SendKeys.Send()方法模拟键盘录入操作。需要注意,这里不能调用前面ProcessCmdKey() 中模拟键盘输入函数SendCharKey()。见如下代码:
protected override void WndProc(ref Message m) // 捕获Mouse的Paste消息{ if (m.Msg == WM_PASTE) // 选择上下文菜单的"粘贴"操作 { this.ClearSelection(); SendKeys.Send(Clipboard.GetText()); // 模拟键盘输入 } else { base.WndProc(ref m); }}
4、消除选择ClearSelection()、删除字符DeleteText()
还必须分析前面代码中的两个函数:
ClearSelection()用以清除当前的选择文本,即清除this.SelectedText
DeleteText()则删除当前字符
需要指出其中的技巧,就是转换Delete键操作为BackSpace操作。此外,函数DeleteText()还需要确定当前的this.SelectionStart值。具体代码如下:
private void ClearSelection() // 清除当前TextBox的选择{ if (this.SelectionLength == 0) { return; } int selLength = this.SelectedText.Length; this.SelectionStart += this.SelectedText.Length; // 光标在选择之后 this.SelectionLength = 0; for (int k = 1; k <= selLength; k++) { this.DeleteText(Keys.Back); }}private void DeleteText(Keys key) // 删除字符并计算SelectionStart值{ int selStart = this.SelectionStart; if (key == Keys.Delete) // 转换Delete操作为BackSpace操作 { selStart += 1; if (selStart > base.Text.Length) { return; } } if (selStart == 0 || selStart > base.Text.Length) // 不需要删除 { return; } if (selStart == 1 && base.Text.Length == 1) { base.Text = ""; base.SelectionStart = 0; } else // selStart > 0 { base.Text = base.Text.Substring(0, selStart - 1) + base.Text.Substring(selStart, base.Text.Length - selStart); base.SelectionStart = selStart - 1; }}
5、结语
本文探讨的是TextBox控件输入的事前处理模式,即在输入字符的同时屏蔽非数字键。在实际应用中一般采取事后处理模式,即在TextBox控件的Exit、Validate等事件中进行输入后处理——离开该控时进行验证。但事后处理模式有如下不足:
与数据源绑定时输入非数字字符可能抛出异常,需要考虑异常捕获
需要判断数据并给出错误提示等处理
参考资料: http://hi.baidu.com/__%B6%C0%B9%C2%B2%D0%D4%C6__/blog/item/b2d151eeaea304212cf5342e.html
展开全部
楼下的朋友的方法没有必要吧
这个可以用一个非常简单的方法实现
拖一个TEXTBOX 然后双击这个控件
之后出来一个TEXTBOX1_CHANGED()
{
在这个函数里用正则表达式约速一下就可以了
可以这样写
if(!match(正则表达式写这里))
{
TEXTBOX1.TEXT="";
MESSBOX.SHOW("只能输入数字");
}
}
这个TEXTBOX1_CHUANGED发生在光标移出文本框时
如想样要用户输入时就限定 那么 把限治写在TEXTBOX1_CHANGING()
{}这个函数里
这个函数发生在用户输入时
这个可以用一个非常简单的方法实现
拖一个TEXTBOX 然后双击这个控件
之后出来一个TEXTBOX1_CHANGED()
{
在这个函数里用正则表达式约速一下就可以了
可以这样写
if(!match(正则表达式写这里))
{
TEXTBOX1.TEXT="";
MESSBOX.SHOW("只能输入数字");
}
}
这个TEXTBOX1_CHUANGED发生在光标移出文本框时
如想样要用户输入时就限定 那么 把限治写在TEXTBOX1_CHANGING()
{}这个函数里
这个函数发生在用户输入时
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
验证控件->{\d}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询