在做管理系统的时候,经常要限制用户的输入,如,只可以输入数字,等等
net 下限制用户输入,很多人是在键盘,或 textBox 的 TextChanged 事件里
这样做
1.不能限制用户的粘贴
2.严重干扰数据绑定等操作
3.有时还需要备份原始数据进行还原
限制输入的时机是在,windows 消息 WM_CHAR 触发时
但.net 恰恰没有提供这个消息的事件映射.
继承TextBox 重写 WndProc 函数 (优点点oo编程的优点我不说了)
这里我们就捕获系统中的WM_CHAE消息来检测用户的输入
public class cxyTextBox : TextBox
{
private const string tip = "这个输入框只允许输入数字";
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case APINameHelper.WM_CHAR:
char inputchar = (char)m.WParam;
if (char.IsDigit(inputchar))
{
base.WndProc(ref m);
return;
}
else
{
MessageBox.Show(tip);
return;
}
// 然后取 m.WParam 进行判断 m.WParam 就是用户输入的字符的 int 表示方式
// 如果是被限制的字符 直接 Return
//不走 base.WndProc (ref m);
break;
case APINameHelper.WM_PASTE:
string pasted = Text;
foreach (char c in pasted)
{
if (char.IsDigit(c))
continue;
else
{
MessageBox.Show(tip);
return;
}
}
//判断剪贴板的数据是否是符合要求如果符合不做任何处理
//否则 Return 不走默然处理即可
base.WndProc(ref m);
return;
break;
default:
break;
}
base.WndProc(ref m);
}
{
private const string tip = "这个输入框只允许输入数字";
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case APINameHelper.WM_CHAR:
char inputchar = (char)m.WParam;
if (char.IsDigit(inputchar))
{
base.WndProc(ref m);
return;
}
else
{
MessageBox.Show(tip);
return;
}
// 然后取 m.WParam 进行判断 m.WParam 就是用户输入的字符的 int 表示方式
// 如果是被限制的字符 直接 Return
//不走 base.WndProc (ref m);
break;
case APINameHelper.WM_PASTE:
string pasted = Text;
foreach (char c in pasted)
{
if (char.IsDigit(c))
continue;
else
{
MessageBox.Show(tip);
return;
}
}
//判断剪贴板的数据是否是符合要求如果符合不做任何处理
//否则 Return 不走默然处理即可
base.WndProc(ref m);
return;
break;
default:
break;
}
base.WndProc(ref m);
}