Winform 的所有TextBox 的TextChange事件

假如我现在一个项目已经做完了,但突然发现项目里的所有文本框都没有过滤特殊字符串的功能,现在我就想把他加上去。我的想法是:我写了一个公共方法IsContainsKeyWor... 假如我现在一个项目已经做完了,但突然发现项目里的所有文本框都没有过滤特殊字符串的功能,现在我就想把他加上去。我的想法是:我写了一个公共方法IsContainsKeyWord(string value),但怎么让项目的任一一个文本框值发生变化时就调用这个方法呢??如果我把所有项目里的文本框都双击它去他的textchange里面写,觉得不妥,还有用其他方法吗?? 展开
 我来答
匿名用户
2013-04-20
展开全部
自定义一个新的TextBox控件,派生自TextBox控件,重载需要的方法和事件,修改所有文本框基于新的TextBox控件。下面是一个自定义TextBox控件的例子:
TextBox控件重写 之NumTextBox,主要实现的功能是,只允许输入数字,或String,Numeric,Currency,Decimal,Float,Double,Short,Int,Long等加了一个属性InputType可以设置其,还可以自己进一步扩展,因为是开源的。 public enum NumTextBoxType
{
String,//是这个的时候,什么都不处理,跟正常TextBox一样
Numeric,//只要是数字就行
Currency,
Decimal,
Float,
Double,
Short,
Int,
Long
}主要代码:
using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Text.RegularExpressions;

namespace YongFa365.Controls.NumTextBox
{
public class NumTextBox : TextBox
{
private NumTextBoxType inputType = NumTextBoxType.Numeric;
public enum NumTextBoxType
{
String,//是这个的时候,什么都不处理,跟正常TextBox一样
Numeric,//只要是数字就行
Currency,
Decimal,
Float,
Double,
Short,
Int,
Long
}

public NumTextBox()
{
this.ContextMenu = new ContextMenu();
}

[
Category("专用设置"),
DefaultValue(NumTextBoxType.Numeric),
Description("设置允许类型:\nString跟普通TextBox功能一样\nNumeric只要是数字就可以")
]
public NumTextBoxType InputType
{
get { return inputType; }
set { inputType = value; }
}

public override string Text
{
get { return base.Text; }
set
{
if (IsValid(value, true))
{
base.Text = value;
}
}
}

private bool IsValid(string val, bool use)
{
bool ret = true;

if (string.IsNullOrEmpty(val))
{
return ret;
}

if (use)
{
if (val.Equals("-") && inputType != NumTextBoxType.Numeric)
{
return ret;
}
}

try
{
switch (inputType)
{
case NumTextBoxType.String:
break;
case NumTextBoxType.Numeric:
if (!Regex.IsMatch(val, @"^\d*$"))
{
ret = false;
}
break;
case NumTextBoxType.Currency:
decimal dec = decimal.Parse(val);
int pos = val.IndexOf(".");
if (pos != -1)
{
ret = val.Substring(pos).Length <= 3;
}
break;
case NumTextBoxType.Float:
float flt = float.Parse(val);
break;
case NumTextBoxType.Double:
double dbl = double.Parse(val);
break;
case NumTextBoxType.Decimal:
decimal dec2 = decimal.Parse(val);
break;
case NumTextBoxType.Short:
short s = short.Parse(val);
break;
case NumTextBoxType.Int:
int i = int.Parse(val);
break;
case NumTextBoxType.Long:
long l = long.Parse(val);
break;
default:
throw new ApplicationException();
}
}
catch
{
ret = false;
}
return ret;
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{

if (keyData == (Keys)Shortcut.CtrlV || keyData == (Keys)Shortcut.ShiftIns)
{
IDataObject iData = Clipboard.GetDataObject();

string newText;
newText = base.Text.Substring(0, base.SelectionStart)
+ (string)iData.GetData(DataFormats.Text)
+ base.Text.Substring(base.SelectionStart + base.SelectionLength);

if (!IsValid(newText, true))
{
return true;
}
}
return base.ProcessCmdKey(ref msg, keyData);
}

protected override void OnLeave(EventArgs e)
{
if (!(inputType == NumTextBoxType.Numeric || inputType == NumTextBoxType.String))
{
if (base.Text != "")
{
if (!IsValid(base.Text, false))
{
base.Text = "";
}
else if (Double.Parse(base.Text) == 0)
{
base.Text = "0";
}
}

}
base.OnLeave(e);

}

protected override void OnKeyPress(KeyPressEventArgs e)
{
if (inputType != NumTextBoxType.String)
{
char c = e.KeyChar;
if (!Char.IsControl(c))
{
if (c.ToString() == " ")
{
e.Handled = true;
return;
}

string newText = base.Text.Substring(0, base.SelectionStart)
+ c.ToString() + base.Text.Substring(base.SelectionStart + base.SelectionLength);

if (!IsValid(newText, true))
{
e.Handled = true;
}
}
}
base.OnKeyPress(e);
}
}
}
冰河下舞清姿5251
2018-04-05 · 超过13用户采纳过TA的回答
知道答主
回答量:105
采纳率:81%
帮助的人:11.2万
展开全部
在Winform(C#)中要实现限制Textbox只能输入数字,一般的做法就是在按键事件中处理,判断keychar的值。限制只能输入数字,小数点,Backspace,del这几个键。数字0~9所对应的keychar为48~57,小数点是46,Backspace是8。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式