TextBox可以显示的最大字符数
刚才我看到了一个问题: StringBuilder不会在TextBox中显示(WinForms,C#) 。 该post的作者无法在他的单行TextBox
显示他的内容,这是一个大约50k字符的字符串。
答案指出他应该将MultiLine
属性更改为true
。 在评论中给出了解释:
由于迭代次数为10000次,因此生成的字符串很大,并且不会显示在单行文本框中。
所以我很好奇单行文本框可以显示的最大长度 。
我浏览了SO并发现了这个问题: TextBox最大字符数量(它不是MaxLength) ,它清除了一些疑问,但并非全部。 我还是想知道:
- 由于
Text
属性是String
类型,为什么当MultiLine
为false
时它甚至无法处理50k字符? - 当
MultiLine
为false
时,TextBox
可以容纳多少个字符? 我们有办法获得这个号码吗? - 为什么
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
,即textBox1
和textBox2
。 textBox2
将显示textBox1
的实时字符数。 另外,我将两个TextBox
的MaxLength
属性更改为0
。 代码如下所示:
public Form1() { InitializeComponent(); textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString(); }
事实certificate,当文本长度超过43679
, Text
完全消失了:
因此,分配给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(??)根本不显示任何内容。