为控件增加一个限制最大字计划

回转窑设备2021年09月06日

一直以来都知道,在 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
友情链接