C# 文本框可以显示的最大字符数
刚才我看到一个问题:。这篇文章的作者无法在他的单行C# 文本框可以显示的最大字符数,c#,winforms,textbox,C#,Winforms,Textbox,刚才我看到一个问题:。这篇文章的作者无法在他的单行文本框中显示他的内容,这是一个大约50k个字符的字符串 答案指出他应该将多行属性更改为true。评论中的一项解释说: 由于迭代次数为10000次,因此生成的字符串很大,不会显示在单行文本框中 因此,我对单行文本框可以显示的最大长度感到好奇 我浏览了一下,发现了这个问题:,它澄清了一些疑问,但不是全部。我还是想知道: 既然Text属性是String类型,为什么当多行为false时,它甚至不能处理50k个字符 当多行为假时,文本框可以容纳多少个字符?
文本框
中显示他的内容,这是一个大约50k个字符的字符串
答案指出他应该将多行
属性更改为true
。评论中的一项解释说:
由于迭代次数为10000次,因此生成的字符串很大,不会显示在单行文本框中
因此,我对单行文本框可以显示的最大长度感到好奇
我浏览了一下,发现了这个问题:,它澄清了一些疑问,但不是全部。我还是想知道:
Text
属性是String
类型,为什么当多行
为false
时,它甚至不能处理50k个字符多行
为假
时,文本框
可以容纳多少个字符?我们有办法得到这个号码吗多行
属性会影响此功能对于问题2第一部分,我做了以下事情来验证: 我怀疑这个长度与分配给
Text
属性的内存有关。我在网上做了一些研究,这给了我一些见解:
Windows NT 4.0、Windows 2000、Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server、Windows XP Home Edition、Windows XP Professional x64 Edition、Windows Server 2003平台注意:如果MaxLength属性设置为0,用户可以输入的最大字符数为2147483646或基于可用内存的数量,以较小者为准
所以我做了一个实验:我创建了2个TextBox
,即textBox1
和textBox2
textBox2
将显示textBox1
的实时字符计数。此外,我将TextBox
的MaxLength
属性更改为0
。代码如下所示:
public Form1()
{
InitializeComponent();
textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString();
}
结果是,当文本长度超过43679
时,text
完全消失:
因此,分配给
Text
属性的内存似乎可以在我的计算机上容纳43679个字符。但我不确定这一数字是否适用于所有计算机。我们有更复杂的方法来获得这个数字吗?从我的测试中,我发现一个文本框不能显示超过32k像素的行,给定文本框的字体
使用这个小试验台
public Form1()
{
InitializeComponent();
textBox1.Font = new System.Drawing.Font("Consolas", 32f);
G = textBox1.CreateGraphics();
for (int i = 0; i < 100; i++) textBox1.Text += i.ToString("0123456789");
}
Graphics G;
private void button2_Click(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++) textBox1.Text += i.ToString("x");
Console.WriteLine( textBox1.Text.Length.ToString("#0 ")
+ G.MeasureString(textBox1.Text, textBox1.Font).Width);
}
public Form1()
{
初始化组件();
textBox1.Font=新系统.Drawing.Font(“控制台”,32f);
G=textBox1.CreateGraphics();
对于(inti=0;i<100;i++)textBox1.Text++=i.ToString(“0123456789”);
}
图形G;
私有无效按钮2\u单击(对象发送者,事件参数e)
{
对于(inti=0;i<10;i++)textBox1.Text++=i.ToString(“x”);
Console.WriteLine(textBox1.Text.Length.ToString(“#0”)
+G.MeasureString(textBox1.Text,textBox1.Font).Width);
}
您可以看到,一旦宽度超过32k,显示就会消失。对于所选的大字体大小,只有大约1350个字符。这应该可以解释我们与评论不同的结果,imo
文本仍然保存数据的完整长度
更新:根据此限制中的答案,与其说是关于文本框及其行,不如说是关于Windows控件:
汉斯·帕桑写道:
这是Windows中的架构限制。各种消息
在窗口中指示位置,如WM_MOUSEMOVE,报告位置
在32位整数中,X为16位,X为16位
Y位置。因此,无法创建大于的窗口
short.MaxValue
因此,在计算其显示时,文本框达到了该限制,并且无声地/完全地(??)不显示任何内容。我无法在您提到的帖子中重现该问题。你能?如果是,您的设置是什么?文本框可以容纳更多的文本。我看到您使用的是单行文本框。一条可见的单行线的长度很可能有一个限制1.我可以复制。我认为这是因为我提到的第二个问题:分配给单行TextBox的
Text
属性的内存超过了50K,而我的只有43K。我可以重现,TextBox显示的行长度不会超过6120个字符。它可以容纳任何长度,但不会显示这么长的行。嗯,对我来说,它最多可以显示43K个字符,就像我在问题中发布的图片。我在测试中看到一些奇怪的差异,这取决于我添加文本的方式。但它总是在那里,只是看不见。。可能是因为字体的原因更新:是的,这是字体!看起来得到的宽度不能超过32k。我想说,这真是一个有趣而尖锐的观察结果。我猜32K应该是32767像素?你能为你的观察找到官方的证据吗?谢谢:染料。如果英语对我们来说是好的。。看起来这并不是关于文本框和行,而是关于控件和它们的尺寸,还有关于旧的win32 API指针大小。我把他的话当作黄金法则哈哈。非常感谢!你能把这篇文章编辑成包括他的引文吗?我觉得对粉丝来说会更好:)