您的位置:首页 > 其它

过滤特定字符的文本框控件开发(具有特定数据类型的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方法,保证文本框内容为数字
最后,实现这些方法:
代码如下:
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中特定文本框的功能,只需要在本例基础上,增添方法和某些必要内容即可,原理都一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐