- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章WPF TextBox实现按字节长度限制输入功能由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前两天做一个项目的时候,由于页面没有限制textbox的输入长度,所以,后台直接报错了,超出数据库最大的长度.
数据库的长度是按照字节来计算的,而且不同的编码格式,汉字占用的字节长度又不相同,比如,我们用的是utf8,一个汉字是3个字节,而默认的default,一个汉字是2个字节.
textbox有个maxlength属性,但是这个属性是不太合乎要求的,因为这个长度,是限制了输入的长度,比如设置20,则无论是数字、字母、汉字最大的长度都是20个,但是,对于数据库来说,长度却不相同了,所以,不能使用这个属性.
为了,统一解决下这个问题,所以给textbox写了附加属性.
1、想要的效果 。
用了附加属性,想达到一个什么效果呢,就是像设置maxlength一样,一旦到了数据库的字节长度,就不再能输入了.
因此,最开始想找一个限制输入的属性,可惜我学的太浅薄,没有找到相关的属性,因此,最后在同事的提醒下,可以记录上一次的内容,然后,如果超长,就用上一次的内容进行赋值 。
2、附加属性 。
既然要用附加属性,并且方便使用,那肯定要给开发者暴露出来至少两个:maxbytelength用来设置最大的字节数,encodemodel用来设置编码格式 。
encodemodel是用menu类型来做的,方便使用时直接敲内容 。
本来上面是直接想用encoding来做的,奈何它是抽象类,只好,写个方法进行了一部转化,并且把encoding类型的属性进行private.
大致上也就是这么一个思路,下面上代码,给需要的人使用.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
public
class
maxbyteattachedproperty : dependencyobject
{
public
enum
encode
{
default
,
ascii,
utf8,
utf32,
utf7,
bigendianunicode,
unicode
}
private
static
string
getpretext(dependencyobject obj)
{
return
(
string
)obj.getvalue(pretextproperty);
}
private
static
void
setpretext(dependencyobject obj,
string
value)
{
obj.setvalue(pretextproperty, value);
}
// using a dependencyproperty as the backing store for pretext. this enables animation, styling, binding, etc...
private
static
readonly
dependencyproperty pretextproperty =
dependencyproperty.registerattached(
"pretext"
,
typeof
(
string
),
typeof
(maxbyteattachedproperty),
new
propertymetadata(
""
));
public
static
int
getmaxbytelength(dependencyobject obj)
{
return
(
int
)obj.getvalue(maxbytelengthproperty);
}
public
static
void
setmaxbytelength(dependencyobject obj,
int
value)
{
obj.setvalue(maxbytelengthproperty, value);
}
// using a dependencyproperty as the backing store for maxbytelength. this enables animation, styling, binding, etc...
public
static
readonly
dependencyproperty maxbytelengthproperty =
dependencyproperty.registerattached(
"maxbytelength"
,
typeof
(
int
),
typeof
(maxbyteattachedproperty),
new
propertymetadata(ontextboxpropertychanged));
private
static
void
ontextboxpropertychanged(dependencyobject d, dependencypropertychangedeventargs e)
{
textbox tb = d
as
textbox;
if
(tb ==
null
)
{
return
;
}
tb.textchanged += tb_textchanged;
}
private
static
void
tb_textchanged(
object
sender, textchangedeventargs e)
{
textbox tb = sender
as
textbox;
if
(isoutmaxbytelength(tb.text, tb))
{
tb.text = getpretext(tb);
tb.select(tb.text.length, 0);
return
;
}
}
public
static
encode getencodemodel(dependencyobject obj)
{
return
(encode)obj.getvalue(encodemodelproperty);
}
public
static
void
setencodemodel(dependencyobject obj, encode value)
{
obj.setvalue(encodemodelproperty, value);
}
// using a dependencyproperty as the backing store for encodem. this enables animation, styling, binding, etc...
public
static
readonly
dependencyproperty encodemodelproperty =
dependencyproperty.registerattached(
"encodemodel"
,
typeof
(encode),
typeof
(maxbyteattachedproperty),
new
propertymetadata(encode.utf8, onencodemodelchanged));
private
static
void
onencodemodelchanged(dependencyobject d, dependencypropertychangedeventargs e)
{
setem(d, getencodemodel(d));
}
private
static
encoding getencodingmodel(dependencyobject obj)
{
return
(encoding)obj.getvalue(encodingmodelproperty);
}
private
static
void
setencodingmodel(dependencyobject obj, encoding value)
{
obj.setvalue(encodingmodelproperty, value);
}
// using a dependencyproperty as the backing store for encodingmodel. this enables animation, styling, binding, etc...
private
static
readonly
dependencyproperty encodingmodelproperty =
dependencyproperty.registerattached(
"encodingmodel"
,
typeof
(encoding),
typeof
(maxbyteattachedproperty),
new
propertymetadata(encoding.utf8));
private
static
void
setem(dependencyobject obj, encode e)
{
switch
(e)
{
case
encode.
default
:
setencodingmodel(obj, encoding.
default
);
break
;
case
encode.ascii:
setencodingmodel(obj, encoding.ascii);
break
;
case
encode.utf8:
setencodingmodel(obj, encoding.utf8);
break
;
case
encode.utf32:
setencodingmodel(obj, encoding.utf32);
break
;
case
encode.utf7:
setencodingmodel(obj, encoding.utf7);
break
;
case
encode.bigendianunicode:
setencodingmodel(obj, encoding.bigendianunicode);
break
;
case
encode.unicode:
setencodingmodel(obj, encoding.unicode);
break
;
default
:
break
;
}
}
private
static
bool
isoutmaxbytelength(
string
txt, dependencyobject obj)
{
int
txtlength = getencodingmodel(obj).getbytes(txt).length;
//文本长度
if
(getmaxbytelength(obj) >= txtlength)
{
setpretext(obj, txt);
return
false
;
}
return
true
;
}
}
|
使用方法如下:
maxbytelength是必须设置的没有进行默认,encodemodel可以不设置但是由于是我们自己用,所以默认是utf8,可以自行修改代码,按照你们公司的编码格式,这样也就不用赋值了.
代码已修正,感谢presia发现的bug,疏忽了.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.cnblogs.com/ZXdeveloper/archive/2017/11/07/7798943.html 。
最后此篇关于WPF TextBox实现按字节长度限制输入功能的文章就讲到这里了,如果你想了解更多关于WPF TextBox实现按字节长度限制输入功能的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
美好的一天!我试图添加两个字节变量并注意到奇怪的结果。 byte valueA = 255; byte valueB = 1; byte valueC = (byte)(valueA + valueB
嗨,我是 swift 的新手,我正在尝试解码以 [Byte] 形式发回给我的字节数组?当我尝试使用 if let string = String(bytes: d, encoding: .utf8)
我正在使用 ipv4 和 ipv6 存储在 postgres 数据库中。 因为 ipv4 需要 32 位(4 字节)而 ipv6 需要 128(16 字节)位。那么为什么在 postgres 中 CI
我很好奇为什么 Go 不提供 []byte(*string) 方法。从性能的角度来看,[]byte(string) 不会复制输入参数并增加更多成本(尽管这看起来很奇怪,因为字符串是不可变的,为什么要复
我正在尝试为UDP实现Stop-and-Wait ARQ。根据停止等待约定,我在 0 和 1 之间切换 ACK。 正确的 ACK 定义为正确的序列号(0 或 1)AND消息长度。 以下片段是我的代码的
我在下面写了一些代码,目前我正在测试,所以代码中没有数据库查询。 下面的代码显示 if(filesize($filename) != 0) 总是转到 else,即使文件不是 0 字节而是 16 字节那
我使用 Apache poi 3.8 来读取 xls 文件,但出现异常: java.io.IOException: Unable to read entire header; 0 by
字典大小为 72 字节(根据 getsizeof(dict) 在字典上调用 .clear() 之后发生了什么,当新实例化的字典返回 240 字节时? 我知道一个简单的 dict 的起始大小为“8”,并
我目前正在努力创建一个函数,它接受两个 4 字节无符号整数,并返回一个 8 字节无符号长整数。我试图将我的工作基于 this research 描述的方法,但我的所有尝试都没有成功。我正在处理的具体输
看看这个简单的程序: #include using namespace std; int main() { unsigned int i=0x3f800000; float* p=(float*)(
我创建了自己的函数,将一个字符串转换为其等效的 BCD 格式的 bytes[]。然后我将此字节发送到 DataOutputStram (使用需要 byte[] 数组的写入方法)。问题出在数字字符串“8
此分配器将在具有静态内存的嵌入式系统中使用(即,没有可用的系统堆,因此“堆”将只是“char heap[4096]”) 周围似乎有很多“小型内存分配器”,但我正在寻找能够处理非常小的分配的一个。我说的
我将数据库脚本从 64 位系统传输到 32 位系统。当我执行脚本时,出现以下错误, Warning! The maximum key length is 900 bytes. The index 'U
想知道 128 字节 ext2 和 256 字节 ext3 文件系统之间的 inode 数据结构差异。 我一直在为 ext2、128 字节 inode 使用此引用:http://www.nongnu.
我试图理解使用 MD5 哈希作为 Cassandra key 在“内存/存储消耗”方面的含义: 我的内容(在 Java 中)的 MD5 哈希 = byte[] 长 16 个字节。 (16 字节来自维基
检查其他人是否也遇到类似问题。 shell脚本中的代码: ## Convert file into Unix format first. ## THIS is IMPORTANT. ###
我们有一个测量数据处理应用程序,目前所有数据都保存为 C++ float,这意味着在我们的 x86/Windows 平台上为 32 位/4 字节。 (32 位 Windows 应用程序)。 由于精度成
我读到在 Java 中 long 类型可以提升为 float 和 double ( http://www.javatpoint.com/method-overloading-in-java )。我想问
我有一个包含 n 个十进制元素的列表,其中每个元素都是两个字节长。 可以说: x = [9000 , 5000 , 2000 , 400] 这个想法是将每个元素拆分为 MSB 和 LSB 并将其存储在
我使用以下代码进行 AES-128 加密来编码一个 16 字节的 block ,但编码值的长度给出了 2 个 32 字节的 block 。我错过了什么吗? plainEnc = AES.enc
我是一名优秀的程序员,十分优秀!