为控件增加一个限制最大字计划
一直以来都知道,在 sql server 中,varchar类型是按字节计算的。例如 varchar(50) 可以存储50个英文字符,但只能存储25个中文字符(一个中文字符2个字节)。改为 nvarchar 可以解决这个问题,但在写sql语句的时候必须加上N标识,否则会产生乱码。
但最近用 C# 做数据库项目,才知道问题很严重。本来输入的合法性就应该在界面上做好限制,例如对于varchar(50)的字段,能在界面上控制用户不能输入超过50个单字节字符,是最好不过的了。然后发现 textbox的 MaxLength 计算的只是 Unicode 长度。
对于 Unicode ,我这里就不做描述了。设置 MaxLength 是不能很好的保证输入的合法性。因此我决定为 textbox 增加一个限制最大字节数的属性:MaxByteLength 。
建立新组件
我们先新建一个组件 TextBoxEx,继承于 TextBox ,增加一个 MaxByteLength 属性
publicpartialclassTextBoxEx:TextBox
{
publicTextBoxEx()
{
InitializeComponent();
}
属性#region属性
privateintm_MaxByteLength=0;
[Description(\"获取或设置用户可在文本框控件中键入或粘贴的最大字节数。0为允许无限长度。\")]
/**////summary
///获取或设置用户可在文本框控件中键入或粘贴的最大字节数。0为允许无限长度。
////summary
publicintMaxByteLength
{
get{returnm_MaxByteLength;}
set{m_MaxByteLength=value;}
}
}
然后重写 WndProc ,实现输入和粘贴的时候对字节长度进行判断。(已修正输入“.”号没有判断的问题)
protectedoverridevoidWndProc(refMessagem)
{
//如果该属性没有设置,则允许输入
if(m_MaxByteLength==0)
{
dProc(refm);
return;
}
switch(g)
{
caseWM_CHAR:
inti=(int)aram;
boolisBack=(i==(int)ck);
boolisCtr=(i==24)||(i==22)||(i==26)||(i==3);
if(isBack||isCtr)
{
//控制键不作处理
}
else
{
charc=(char)i;
if(CheckByteLengthFlow(String()))
{
break;
}
}
dProc(refm);
break;
caseWM_PASTE:
IDataObjectiData=tDataObject();//取剪贴板对象
if(tDataPresent(xt))//判断是否是Text
{
stringtext=(string)tData(xt);//取数据
if(CheckByteLengthFlow(text))
{
sult=(IntPtr)0;//不可以粘贴
break;
}
}
dProc(refm);
break;
妻子也会不开心吧?在传统家庭结构中 default:
dProc(refm);
break;
}
}
///summary
///判断即将输入的文本长度是否溢出
////summary
///paramname=\"text\"文本/param
///returns是否溢出/returns
privateboolCheckByteLengthFlow(stringtext)
{
intlen=GetByteLength(text);//输入的字符的长度
inttlen=GetByteLength(xt);//文本框原有文本的长度
intslen=GetByteLength(lectedText);//文本框选中文本的长度
return(m_MaxByteLength(tlen-slen+len));
}
///summary
///计算文本字节长度,区分多字节字符
////summary
///paramname=\"text\"文本/param
///returns文本字节长度/returns
privateintGetByteLength(stringtext)
{
tBytes(text).Length;
}
另外,增加一个 RealText 属性,该属性返回具有合法长度的文本, 不会截断多字节字符
publicstringRealText
{
get
{
if(m_MaxByteLength==0)
{
xt;
}
if(m_MaxByteLength=GetByteLength(xt))
{
xt;
}
stringtext=xt;
if(NullOrEmpty(text))
{
returntext;
}
char[]c=CharArray();
StringBuildersb=newStringBuilder();
intcount=0;
for(inti=0;ngth;i++)
{
count+=GetByteLength(c[i].ToString());
if(m_MaxByteLength=count)
{
pend(c[i]);
}
}
String();
}
}
至此,可以通过设置 MaxByteLength 来限制最大字节数了。
查看本文来源
哈尔滨卵巢炎哪家好康恩贝肠炎宁片治疗拉肚子效果
避孕套破了怎么办
- 上一页:中静态构造函数的学习物业
- 下一页:之父谈在年覆盖
-
温州又多一所新所学校!
仲夏二月,艳阳高照 崭新校四区,首次亮相 6月8日上午9点 衢州设计该学院教...
2023-09-15
-
要求烟草 陕西行动【八】陕北:做控烟榜样,建无烟机关、无烟社区!
绥德: 控屑促销入机关 身体力行不严重危害 为提高人们对国内控屑工作的...
2023-09-10
-
牛肉黄瓜,加盐后别直接加调料!多做1步,脆爽入味,1小时就牛肉好
腌菱角,加有鱼肉后别实际上加有酱料!多继续做1步,更为脆爽,1时长就熟...
2023-09-07
-
中学食堂花椒粒过期被罚6.5万 校外:怕破漏放旧包装袋
中学食堂醋粒过期受罚6.5万,校内:怕破漏放旧包装袋 6月27日,贵州遵义...
2023-09-04
-
把女朋友当女儿养的男生也比较聪明 女孩子本来就是你越宠爱 她越可爱的 你给她足够的安全感和保护 她也
把女朋友当女儿饲的男生也非常聪明 女孩子本来就是你越好宠爱 她越好可爱...
2023-09-03
-
券业重磅!行业诚信准则发布,声誉信息硬指标明确,失信成本极大增强
交易所从业部门看过来,从业者道义原则上、律师资格威信的资讯规约发布。...
2023-09-02