过滤特定字符的文本框控件开发(具有特定数据类型的TextBox控件开发)
2010-10-12 14:35
831 查看
继承微软的现有控件编写满足自己特定需求的控件是一件非常有趣的事情,在进行项目开发的时候,常常需要编写具有特定功能的文本框,有的只能输入数字,有的只能输入时间,还有的只能输入百分比等等,该怎样编写这样的控件呢?下面就以开发只能输入正整数值的文本框为例进行讲解。
首先,定义一个名为CoreTextBox的组件类,该类继承自TextBox。
其次,定义类的属性和方法。要实现上面提出的功能需要从两方面来考虑,一方面是:在进行键盘敲击的时候,过滤掉非数字键,使其不能显示在文本框上;另一方面是:在文本框中进行粘贴操作的时候,对粘贴的内容进行验证。下面是设计出的方法(包括重写的方法):
控制键盘敲击:
1) protected virtual bool IsValidateNumberKey(Keys key)
--验证是否为数字键或允许的功能键
2) protected virtual void NumberKeyHandler(object sender,KeyEventArgs e)
--对按下的键盘按键进行验证,设置e.Handled的值
3) private void BindHandlers
--将KeyDown事件与NumberKeyHandler进行关联
4) protected override void OnCreateControl()
--调用BindHandlers方法
5) protected override void OnKeyPress(KeyPressEventArgs e)
--设置e.Handled的值,控制是否将敲下的键盘字符显示在文本框中
验证在文本框中粘贴的内容:
1) protected virtual void SetTextAsNumber()
--将文本内容转化为数字,如果转化失败,则将文本框内容置空
2) protected override void OnTextChanged(EventArgs e)
--调用SetTextAsNumber方法,保证文本框内容为数字
最后,实现这些方法:
代码如下:
总结:
1)上面的控件从两方面对输入的内容进行控制,一种是使非数字键失效,一种是对粘贴内容进行验证,开发其他类似功能的文本框思路也是如此(如过滤敏感字符),读者可根据实际情况进行开发。
2)上面只是一个简单实现,目的是让读者了解实现此类功能的思路和原理,其实在真正进行开发的时候验证工作还需更加详细和周密。
3) 我们可以在文本框中添加一个DataType属性,使一个文本框实现n中特定文本框的功能,只需要在本例基础上,增添方法和某些必要内容即可,原理都一样。
首先,定义一个名为CoreTextBox的组件类,该类继承自TextBox。
其次,定义类的属性和方法。要实现上面提出的功能需要从两方面来考虑,一方面是:在进行键盘敲击的时候,过滤掉非数字键,使其不能显示在文本框上;另一方面是:在文本框中进行粘贴操作的时候,对粘贴的内容进行验证。下面是设计出的方法(包括重写的方法):
控制键盘敲击:
1) protected virtual bool IsValidateNumberKey(Keys key)
--验证是否为数字键或允许的功能键
2) protected virtual void NumberKeyHandler(object sender,KeyEventArgs e)
--对按下的键盘按键进行验证,设置e.Handled的值
3) private void BindHandlers
--将KeyDown事件与NumberKeyHandler进行关联
4) protected override void OnCreateControl()
--调用BindHandlers方法
5) protected override void OnKeyPress(KeyPressEventArgs e)
--设置e.Handled的值,控制是否将敲下的键盘字符显示在文本框中
验证在文本框中粘贴的内容:
1) protected virtual void SetTextAsNumber()
--将文本内容转化为数字,如果转化失败,则将文本框内容置空
2) protected override void OnTextChanged(EventArgs e)
--调用SetTextAsNumber方法,保证文本框内容为数字
最后,实现这些方法:
代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; namespace CoreTextBox { public partial class CoreTextBox : TextBox { public CoreTextBox() { InitializeComponent(); } bool _keyHandled = false; protected override void OnKeyPress(KeyPressEventArgs e) { base.OnKeyPress(e); e.Handled = this._keyHandled; } protected override void OnTextChanged(EventArgs e) { this.SetTextAsNumber(); base.OnTextChanged(e); } protected virtual void SetTextAsNumber() { try { long temp_long = Convert.ToInt64(this.Text); } catch { base.Text = string.Empty; } } protected override void OnCreateControl() { base.OnCreateControl(); this.BindHandlers(); } private void BindHandlers() { base.KeyDown += new KeyEventHandler(this.NumberKeyHandler); } protected virtual void NumberKeyHandler(object sender,KeyEventArgs e) { if(base.ReadOnly) { e.Handled = true; this._keyHandled = e.Handled; } else if(e.Control||e.Alt) { e.Handled = false; this._keyHandled = e.Handled; } else if(e.Shift&&((e.KeyCode==Keys.Insert)||(e.KeyCode==Keys.Delete))) { e.Handled = false; this._keyHandled = e.Handled; } else if(!this.IsValidateNumberKey(e.KeyCode)) { e.Handled = true; this._keyHandled = e.Handled; } else if (this.IsValidateNumberKey(e.KeyCode) && e.Shift) { e.Handled = true; this._keyHandled = e.Handled; } else { e.Handled = false; this._keyHandled = e.Handled; } } protected virtual bool IsValidateNumberKey(Keys key) { switch(key) { case Keys.D0: case Keys.D1: case Keys.D2: case Keys.D3: case Keys.D4: case Keys.D5: case Keys.D6: case Keys.D7: case Keys.D8: case Keys.D9: case Keys.NumPad0: case Keys.NumPad1: case Keys.NumPad2: case Keys.NumPad3: case Keys.NumPad4: case Keys.NumPad5: case Keys.NumPad6: case Keys.NumPad7: case Keys.NumPad8: case Keys.NumPad9: case Keys.End: case Keys.Home: case Keys.Left: case Keys.Right: case Keys.Delete: case Keys.Back: return true; } return false; } } }
总结:
1)上面的控件从两方面对输入的内容进行控制,一种是使非数字键失效,一种是对粘贴内容进行验证,开发其他类似功能的文本框思路也是如此(如过滤敏感字符),读者可根据实际情况进行开发。
2)上面只是一个简单实现,目的是让读者了解实现此类功能的思路和原理,其实在真正进行开发的时候验证工作还需更加详细和周密。
3) 我们可以在文本框中添加一个DataType属性,使一个文本框实现n中特定文本框的功能,只需要在本例基础上,增添方法和某些必要内容即可,原理都一样。
相关文章推荐
- “类型“TextBox”的控件“FullName”必须放在具有 runat=server 的窗体标记内”的解决办法
- 类型“TextBox”的控件“textBox1”必须放在具有 runat=server 的窗体标记内
- 重写C#的TextBox控件达到无法粘贴,无法输入特定字符功能
- 类型“TextBox”的控件“email”必须放在具有 runat=server 的窗体标记内。
- System.Web.HttpException: 类型“TextBox”的控件“ctl02_TextBox2”必须放在具有 runat=server 的窗体标记内。
- 在winform开发中,将集合类型(ArrayList)邦定到控件上,实现集合与控件中显示的数据同步
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- 【Java开发常见问题解决】文本框表情emoji字符过滤处理方法
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- 类型“TextBox”的控件“UName”必须放在具有 runat=server 的窗体标记内
- mysql 开发基础系列4 字符数据类型
- 使用FilteredTextBoxExtender控件(过滤字符)的方法
- 从GridView中直接导出数据到Excel文件 处理导出乱码 类型“GridView”的控件“XXXX”必须放在具有 runat=server 的窗体标记内。”的异常
- textBOX验证控件,自动验证数据正确与否!只需选择你的数据类型
- 请高手能看一下。谢谢!(类型“TextBox”的控件“FullName”必须放在具有 runat=server 的窗体标记内。)
- ORA-00911: 无效字符,PL/SQL: ORA-01790 表达式必须具有与对应表达式相同的数据类型
- 类型“GridView”的控件“GridView1”必须放在具有 runat=server 的窗体标记内的解决办法。
- window对象的弹窗方法、将字符转换为数据、判断变量类型
- Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单