婚礼策划网 加入收藏  -  设为首页
您的位置:婚礼策划网 > 摄影技术 > 正文
c#中如何控制文本框中输入字符的范围
c#中如何控制文本框中输入字符的范围
提示:

c#中如何控制文本框中输入字符的范围

在定制的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 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等事件中进行输入后处理——离开该控时进行验证。但事后处理模式有如下不足:
与数据源绑定时输入非数字字符可能抛出异常,需要考虑异常捕获
需要判断数据并给出错误提示等处理

ASP.NET常用6种验证控件介绍
提示:

ASP.NET常用6种验证控件介绍

      RequiredFieldValidator (必须字段验证) 用于检查是否有输入值     CompareValidator (比较验证) 按设定比较两个输入     RangeValidator (范围验证) 输入是否在指定范围     RegularExpressionValidator (正则表达式验证) 正则表达式验证控件     CustomValidator (自定义验证) 自定义验证控件     ValidationSummary (验证总结) 总结验证结果      下面介绍一下这些控件的使用方法    一 CompareValidator (比较验证)控件     比较控件比较两个控件的输入是否符合程序设定 大家不要把比较仅仅理解为" 相等"  尽管相等是用的最多的 其实 这里的比较包括范围很广 大家看标准代码就会明白     比较控件的标准代码如下      <ASP:CompareValidator id="Validator_ID" RunAt="Server"    ControlToValidate=" 要验证的控件ID"    errorMessage=" 错误信息"    ControlToCompare=" 要比较的控件ID"    type="String|Integer|Double|DateTime|Currency"    operator="Equal|NotEqual|GreaterThan|GreaterTanEqual|LessThan|LessThanEqual|DataTypeCheck"  Display="Static|Dymatic|None"    > 占位符    在以上标准代码中     Type 表示要比较的控件的数据类型     Operator 表示比较操作(也就是刚才说的为什么比较不仅仅是" 相等" 的原因) 这里 比较有  种方式     其他属性和RequiredFieldValidator 相同     在这里 要注意ControlToValidate 和ControlToCompare 的区别 如果operate 为 GreateThan  那么 必须ControlToCompare 大于ControlToValidate 才是合法的 这下 应该明白它们两者的 意义了吧?例子程序请参考RequiredFieldValidator 控件 对照标准代码自己设计    二 RequiredFieldValidator (必须字段验证)的使用           RequiredFieldValidator 控件使用的标准代码如下         占位符        在以上标准代码中     ControlToValidate  表示要进行检查控件ID      ErrorMessage  表示当检查不合法时 出现的错误信息     Display  错误信息的显示方式 Static 表示控件的错误信息在页面中占有肯定位置 Dymatic 表示控件错误信息出现时才占用页面控件 None 表示错误出现时不显示 但是可以在ValidatorSummary 中显示     占位符 表示Display 为Static 时 错误信息占有" 占位符" 那么大的页面空间     现在 让我们看一个实例          <ASP:RequiredFieldValidator id="Validator " Runat="Server"  ControlToValidate="txtName"  ErrorMessage=" 姓名必须输入"  Display="Static"& gt;    * 姓名必须输入         在以上例子中 检查txtName 控件是否有输入 如果没有 显示错误信息" 姓名必须输入"  是不是很简单?    注意 以上代码和下面其他控件的代码最好放入Form 中 和ASP 中不一样的是 Form 最好写为这样         其他代码     这样 Form 在服务器端执行 提交才会有效      三 RangeValidator (范围验证)控件     验证输入是否在一定范围 范围用MaximumValue (最大)和MinimunVlaue 来确定 标准代码如下         占位符        在以上代码中     用MinimumValue 和MaximumValue 来界定控件输入值得范围 用type 来定义控件输入值的类型      四 RegularExpresionValidator (正则表达式)控件     正则表达式验证控件的功能非常强大 你可以自己容易构造验证方式 我们先来看看标准代码         占位符        在以上标准代码中 ValidationExpression 是重点 现在来看看它的构造     在ValidationExpression 中 不同的字符表示不同的含义     " " 表示任意字符     "*" 表示和其他表达式一起 表示容易组合     "[A Z]" 表示任意大写字母     "d" 表示容易一个数字     注意 在以上表达式中 引号不包括在内      举例      正则表达式 " *[A Z]" 表示数字开头的任意字符组合其后接一个大写字母      五 ValidationSummary (验证总结)控件     该控件收集本页的所有验证错误信息 并可以将它们组织以后再显示出来 其标准代码如下                在以上标准代码中 HeadText 相当于表的HeadText  DisplayMode 表示错误信息显示方式 List 相当于 HTML 中的  BulletList 相当于HTML 中的  SingleParegraph 表示错误 信息之间不作如何分割      六 CustomValidator (自定义验证)控件     该控件用自定义的函数界定验证方式 其标准代码如下      占位符  lishixinzhi/Article/program/net/201311/14164

ASP.NETWeb服务器验证控件如何使用
提示:

ASP.NETWeb服务器验证控件如何使用

什么是验证控件?希望用户输入正确的类型的数据,为了验证用户输入是否满足要求,必须对输入的值、范围或格式进行检查。.NET中验证控件在哪里?在工具箱的验证分组里。常用的ASP.NET控件几个?分别是什么?1)CompareValidator控件:与给定值比较.2)CustomValidator控件:用户自己定制校验逻辑3)RangeValidator控件:检查控件的值是否在给定的有效范围内。4)RegularExpressValidator控件:使用正则表达式验证用户输入的数据是否符合预定义的格式。5)RequiredFieldValidator控件:防止用户输入空值。6)ValidationSummary控件:汇总Web页上所有验证控件的错误信息。追本溯源:所有的验证控件都是从基类BaseValidator中继承而来的,为验证控件提供了一些公有的属性:怎样使用ASP.Net验证控件?和添加其他服务器控件一样,即可启用对用户输入的验证。在控件的ControlToValidator属性中赋予要关联验证控件的ID号,关联起来。 客户端验证?服务器验证?客户端的验证为了用户体验,防止人家提交很多遍都填不对 例如一些合法性检查,比如字符串长度,非法字符,正则表达式,非空等。大多是友好提示(本质不靠谱,但响应快。)服务器端的验证业务逻辑、安全性需要的真正的验证,比如密码对不对,需要在后台写代码来有没有权限之类的。需要提交数据并保存的地方,放到服务器验证。(为了安全,客户端验证的,服务器端也验证。)混合验证:客户端和服务器都需要验证啦。DEMO:这里面主要说说客户端验证和服务器验证 两种方式,以CustomValidator控件为例:验证用户输入的是否为偶数客户端验证:在这里用到JavaScrip代码: /*验证是否为偶数函数*/ function ClientValidate(source, args) { if ((args.value % 2) == 0) args.IsValid = true; else args.IsValid = false; } 客户端验证控件代码: 服务器验证,C#代码:public partial class _Default : System.Web.UI.Page { //服务器端验证输入是否为偶数。 protected void cvInput_ServerValidate(object source, ServerValidateEventArgs args) { //获取验证控件输入值。 int value = int.Parse(args.Value); //判断是否为偶数。 if ((value % 2) == 0) { args.IsValid = true; } else { args.IsValid = false; } } } 服务器验证,控件代码: 最终得到的效果图如下所示:和CS的控件比起来,CS的控件中没有验证控件哦。学了母版、用户控件的使用,今天又学习了ASP.NETWeb服务器验证控件的使用方法,希望大家每篇文章都有所收获。