[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);
}
}
相关文章推荐
- C#验证:限制TextBox只能输入数字并控制输入数字的长度(数字)
- c# 限制textbox的输入范围和长度(长度不用maxlength方法)
- c# 限制textbox的输入范围和长度(长度不用maxlength方法)
- C#Winform限制Textbox只能输入数字
- textField限制输入长度(含中文限制)
- 请问在C#的Winform下如何用正则表达式限制用户只能在textBox中输入18位的身份证号码。
- iOS开发陷阱之UITextField中文输入长度的限制
- UITextField限制中文输入下的字符长度
- c# 的 textbox 默认情况下是有最大字符长度限制的
- C# TextBox限制只能输入数字(不包括点号)
- UITextField 限制输入中文长度
- c#中设置像数量,价格,金额等的textbox的限制条件,用户只能输入数字或小数
- iOS开发陷阱之UITextField中文输入长度的限制
- C# textbox中输入时加限制条件 // C#Winform下限制TextBox只能输入数字 // 才疏学浅(TextBox 小数点不能在首位+只能输入数字)
- 突破Console.ReadLine() 的256 个字符输入长度限制!(c#)
- C#Winform限制TextBox文本框只能输入文本的格式
- ios textfield限制中文输入长度
- c#中设置像数量,价格,金额等的textbox的限制条件,用户只能输入数字或小数(小数及负号只能输一次)
- C# 限制TextBox控件中只能输入数字
- EditText中禁止输入中文的方法及长度限制