TextBox 屏蔽字符和汉字问题和复制粘贴问题

NK_WORK 2006-12-22 03:23:15
现在还有一点问题
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = (e.KeyChar < '0' || e.KeyChar > '9');
if (e.KeyChar ==(char ) Keys.Back )
{
//允许BackSpace
e.Handled = false;
}
}

这个语句屏蔽掉了字符,对于汉字和复制粘贴还是不可以。

这个好象可以屏蔽掉汉字输入和粘贴问题。
public const int WM_PASTE = 0x0302;//粘貼消息
protected override void WndProc(ref Message m)
{
if(m.Msg != WM_PASTE)base.WndProc (ref m);
}


有谁有更好的方法讲解一下。
先谢谢了/
...全文
429 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
NK_WORK 2006-12-22
  • 打赏
  • 举报
回复
大家都讨论一下 WndProc
StrayFog 2006-12-22
  • 打赏
  • 举报
回复
好例子,还不错!
NK_WORK 2006-12-22
  • 打赏
  • 举报
回复
WndProc 是一个窗口过程函数,所有的事件和消息处理方法都通过它提交到消息队列中。
上面的例子就是将 m.msg 判断一下,满足提交条件的话操作,否则不提交消息队列中
NK_WORK 2006-12-22
  • 打赏
  • 举报
回复
是不是应该这样理解的。
WndProc 是一个窗口过程函数,他接收当前使用控件的消息和事件处理方法,
过程函数 protected override void WndProc(ref Message m)
中的m.msg 就是获取消息的标识符。 所有控件的所有消息和事件处理方法都是通过 WndProc处理的。 不同的控件有不同的WndProc 是吗?
北京的雾霾天 2006-12-22
  • 打赏
  • 举报
回复
其实代码看上去是挺多的,但是实现上好理解也比较实用.

主要的思路就是在TextBox处理我们不希望它处理的消息之前来自己处理这些消息了.
代码中没有用到任何API,只是把消息接过来了.

比如我们发现TextBox在将要处理的按键消息(比如A或"我"等)时发现这个按键我们不想让它出现在Textbox里,那么我们就不要把这时的消息m(Message)传到基类的WndProc方法中,这样基类就不会处理这个消息了,自然就不出在文本框里出现这个按键了.

但是并不是所有的消息都不要base.WndProc来处理,比如粘贴文本的消息我们还是要base.WndProc来处理的,怎么办呢,这就用到了消息的返回值m.Result,在粘贴的消息中如果这个值为0则不处理粘贴了.这样也就不会出现在TextBox上了.

总的说来合适的处理base.WndProc就会得到我们想要的某种效果.
mabaolin 2006-12-22
  • 打赏
  • 举报
回复
mark
NK_WORK 2006-12-22
  • 打赏
  • 举报
回复
lxcnn(过客) 是用正则表达式吧。 挺好
但是有点视觉残影。

hbxtlhx(平民百姓) 这个可以, 但是看着有点费劲。 有高手讲解一下吗?让大家都明白一下/
DeanMonica 2006-12-22
  • 打赏
  • 举报
回复
上面 MaxLength="20"忘了去掉,
<asp:TextBox ID="TextBox1" runat="server" onPaste="return false" onDrop="return false"></asp:TextBox>
DeanMonica 2006-12-22
  • 打赏
  • 举报
回复
<asp:TextBox ID="TextBox1" runat="server" onPaste="return false" onDrop="return false" MaxLength="20"></asp:TextBox>

// onPaste="return false" 禁止复制
//onDrop="return false" 禁止拖拉

-过客- 2006-12-22
  • 打赏
  • 举报
回复
哦,txtLineNumber.Text = "";这里txtLineNumber应该是textBox1,忘了改,延用了我程序里的名称了
Markc 2006-12-22
  • 打赏
  • 举报
回复
up.
-过客- 2006-12-22
  • 打赏
  • 举报
回复
楼主的意思是只允许输入数字吗?我以前写过一个程序里是用正则在textchanged事件里判断的,效果挺好的,楼主可以试下,不会有汉字和粘贴的问题
private void textBox1_TextChanged(object sender, EventArgs e)
{
//判断输入是否为数字,是则显示,否则清空
Regex r = new Regex("^[0-9]+$");
if (!r.IsMatch (textBox1.Text))
{
txtLineNumber.Text = "";

}
}
北京的雾霾天 2006-12-22
  • 打赏
  • 举报
回复
上面的代码基本考虑全了。
北京的雾霾天 2006-12-22
  • 打赏
  • 举报
回复
如果要想做的严禁一些,最好是继承一个新的TextBox类,如下的就是一个,楼主可以测试:
/// <summary>
/// 只能对数值操作的TextBox。
/// </summary>
public class TextBoxNumEx : System.Windows.Forms.TextBox
{
public TextBoxNumEx()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0102:
bool isSign = ((int)m.WParam == 45);
bool isNum = ((int)m.WParam >= 48) && ((int)m.WParam <= 57);
bool isBack = (int)m.WParam == (int)Keys.Back;
bool isDelete = (int)m.WParam == (int)Keys.Delete;
bool isCtr = ((int)m.WParam == 24) || ((int)m.WParam == 22) || ((int)m.WParam == 26) || ((int)m.WParam == 3);

if (isNum || isBack || isCtr)
{
base.WndProc(ref m);
}
if (isSign)
{
if (this.SelectionStart != 0)
{
break;
}
base.WndProc(ref m);
break;
}
if (isDelete)
{
if (this.Text.IndexOf(".") < 0)
{
base.WndProc(ref m);
}
}
if ((int)m.WParam == 1)
{
this.SelectAll();
}
break;
case 0x0302:
IDataObject iData = Clipboard.GetDataObject();//取剪贴板对象

if (iData.GetDataPresent(DataFormats.Text)) //判断是否是Text
{
string str = (string)iData.GetData(DataFormats.Text);//取数据
if (MatchNumber(str))
{
base.WndProc(ref m);
break;
}
}
m.Result = (IntPtr)0;//不可以粘贴
break;
default:
base.WndProc(ref m);
break;
}
}
private bool MatchNumber(string numberText)
{
if (string.IsNullOrEmpty(numberText))
{
return false;
}

int index = 0;
string strNum = "-0.123456789";

index = numberText.IndexOf(strNum[0]);
if (index >= 0)
{
if (numberText.Length == 1 || numberText.IndexOf(strNum[0], index + 1) > 0)
{
return false;
}
}
index = numberText.IndexOf(strNum[2]);
if (index != -1)
{
index = numberText.IndexOf(strNum[2], index + 1);
if (index != -1)
{
return false;
}
}
return true;
}
}
liujia_0421 2006-12-22
  • 打赏
  • 举报
回复
用正则表达式..

在TextBox失去焦点或者TextChanged时作下判断...
bitpolar 2006-12-22
  • 打赏
  • 举报
回复
可以在控件失去焦点的时候再做判断
hcl8260 2006-12-22
  • 打赏
  • 举报
回复
bang LZ 顶

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧