【发布时间】:2014-10-31 18:37:40
【问题描述】:
刚才看到一个问题:StringBuilder Won't Show In TextBox (WinForms, C#)。帖子的作者无法在他的单行TextBox 中显示他的内容,这是一个大约 50k 个字符的字符串。
答案指出他应该将MultiLine属性改为true。评论中给出了解释:
由于迭代为 10000 次,因此生成的字符串很大,并且没有显示在单行文本框中。
所以我很好奇单行文本框可以显示的最大长度。
我浏览了 SO 并发现了这个问题:TextBox maximum amount of characters (it's not MaxLength),它消除了一些疑问,但不是全部。我还想知道:
- 既然
Text属性是String类型,为什么MultiLine是false时它甚至不能处理50k个字符? - 当
MultiLine是false时,TextBox可以容纳多少个字符?我们有办法得到这个号码吗? - 为什么
MultiLine属性会影响此功能?
对于问题 2 第一部分,我做了以下事情来验证:
我怀疑这个长度与分配给Text 属性的内存有关。我在网上做了一些研究,这个MSDN Documentation 给了我一些见解:
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 Platform 注意:如果 MaxLength 属性设置为 0,则用户可以输入的最大字符数为 2147483646 或基于可用内存的数量,以较小者为准。
于是我做了一个实验:我创建了2个TextBox,即textBox1和textBox2。 textBox2 将显示textBox1 的实时字符数。此外,我将MaxLength 属性更改为0,用于TextBox。代码如下所示:
public Form1()
{
InitializeComponent();
textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString();
}
原来当文字长度超过43679时,Text就彻底消失了:
看来分配给Text 属性的内存在我的计算机上可以容纳43679 个字符。但我不确定这个数字是否适用于所有计算机。我们有更复杂的方法来获得这个数字吗?
【问题讨论】:
-
我无法重现您所指帖子中的问题。你可以吗?如果是这样,您的设置是什么?文本框可以容纳 更多 更多的文本。我看到您使用的是单行文本框。可见单行的长度可能有一个限制..
-
我可以复制。我认为是因为我提到的第二个问题:您分配给单行 TextBox 的
Text属性的内存超过 50K,但我的只有 43K。 -
我可以重现 TextBox 不会显示超过大约 6120 个字符的行。它可以保持任何长度,但不会显示这么长的行。
-
嗯,它可以显示多达 43K 个字符,就像我在问题中发布的图片一样。
-
我在测试中发现了一些奇怪的差异,这取决于我添加文本的方式。但它总是在那里,只是不可见..也许字体是原因..? - 更新:是的,它是字体!看起来生成的宽度不能超过 32k。