您的位置:首页 > 编程语言 > C#

[C#] TextBox限制输入长度(中文字算2码)

2014-03-18 10:11 525 查看
TextBox本身有一个MaxLength的属性可以限制输入长度但他计算长度的方式是不论中文字还英文字都算1码如果要配合SQLServer的Varchar栏位做长度限制那遇到中文字的部份就很容易出错了因为中文字存到Varchar栏位占用的长度算2码既然TextBox.MaxLength属性没办法达到我们的需求那就自己重写一个TextBox控制项并增加MaxByteLength的属性
publicpartialclassuTextBox:TextBox
{
uint_maxByteLength=0;
publicuintMaxByteLength//用来限制输入长度,中文字长度以2码来计算
{
get{return_maxByteLength;}
set{_maxByteLength=value;}
}
}
然后在OnKeyPress事件中判断输入的长度是不是超过MaxByteLength设定的长度这边要注意的是若user有选取文字的话因为选取的文字是即将被取代掉的所以要先把那些文字的长度减去才不会发生key不进去的囧境
protectedoverridevoidOnKeyPress(KeyPressEventArgse)
{
base.OnKeyPress(e);
if(ReadOnly)return;//唯读不处理
if(_maxByteLength==0)return;//没设定MaxByteLength不处理
if(char.IsControl(e.KeyChar))return;//Backspace,Enter...等控制键不处理
inttextByteLength=Encoding.GetEncoding(950).GetByteCount(Text+e.KeyChar.ToString());//取得原本字串和新字串相加后的Byte长度
intselectTextByteLength=Encoding.GetEncoding(950).GetByteCount(SelectedText);//取得选取字串的Byte长度,选取字串将会被取代
if(textByteLength-selectTextByteLength>_maxByteLength)e.Handled=true;//相减后长度若大于设定值,则不送出该字元
}
注:Encoding.GetEncoding(950)==Encoding.GetEncoding("big5")还有一点要注意的是如果user是用复制贴上的方式因为贴上的资料不会经过OnKeyPress事件检核所以我们必须把复制的资料拦截下来后再拆解成一个字元一个字元的传递给OnKeyPress去检核
intWM_PASTEDATA=0x0302;//贴上资料的讯息
protectedoverridevoidWndProc(refMessagem)
{
if(m.Msg==WM_PASTEDATA)//如果收到贴上资料的讯息,包括Ctrl+V,Shift+Ins和滑鼠右键选单中的贴上
SendCharFromClipboard();//就把剪贴簿中的字串一个字元一个字元的拆开,再传给自己
else
base.WndProc(refm);
}
intWM_CHAR=0x0102;
privatevoidSendCharFromClipboard()
{
foreach(charcinClipboard.GetText())
{
Messagemsg=newMessage();
msg.HWnd=Handle;
msg.Msg=WM_CHAR;
msg.WParam=(IntPtr)c;
msg.LParam=IntPtr.Zero;
base.WndProc(refmsg);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: