TextBox可以显示的最大字符数

刚才我看到了一个问题: StringBuilder不会在TextBox中显示(WinForms,C#) 。 该post的作者无法在他的单行TextBox显示他的内容,这是一个大约50k字符的字符串。

答案指出他应该将MultiLine属性更改为true 。 在评论中给出了解释:

由于迭代次数为10000次,因此生成的字符串很大,并且不会显示在单行文本框中。

所以我很好奇单行文本框可以显示最大长度

我浏览了SO并发现了这个问题: TextBox最大字符数量(它不是MaxLength) ,它清除了一些疑问,但并非全部。 我还是想知道:

  1. 由于Text属性是String类型,为什么当MultiLinefalse时它甚至无法处理50k字符?
  2. MultiLinefalse时, TextBox可以容纳多少个字符? 我们有办法获得这个号码吗?
  3. 为什么MultiLine属性会影响此function?

对于问题2的第一部分,我做了以下事情来validation:

我怀疑这个长度与分配给Text属性的内存有关。 我在网上做了一些研究,这篇MSDN文档给了我一些见解:

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 ,即textBox1textBox2textBox2将显示textBox1的实时字符数。 另外,我将两个TextBoxMaxLength属性更改为0 。 代码如下所示:

 public Form1() { InitializeComponent(); textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString(); } 

事实certificate,当文本长度超过43679Text完全消失了:

4367943680

因此,分配给Text属性的内存似乎可以保留在我的计算机上的43679个字符。 但我不确定这个号码对于所有计算机是否相同。 我们是否有更复杂的方法来获得这个数字?

提前致谢!

从我的测试中我发现,给定TextBox的Font,文本框不能显示超过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); } 

一旦宽度超过32k,您就会看到显示消失。 对于所选择的大字体,仅发生约1350个字符。 这应该可以解释我们从评论中得到的不同结果,即imo。

文本仍保留数据的全长。

更新 :根据这篇文章中的答案, 这个限制不是关于TextBoxes及其行,而是关于Windows控件的一般情况:

Hans Passant写道:

这是Windows中的架构限制。 指示窗口中位置的各种消息,如WM_MOUSEMOVE,以32位整数报告位置,X位为16位,Y位为16位。 因此,您无法创建大于short.MaxValue的窗口。

因此,在计算其显示时,TextBox会达到该限制,并且静默/ gracfully(??)根本不显示任何内容。