刚才我看到了一个问题:StringBuilder Won't Show In TextBox (WinForms, C#)。该帖子的作者无法在他的单行TextBox
中显示他的内容,这是一个大约5万字符的字符串。
答案指出他应该将MultiLine
属性更改为true
。在评论中给出了解释:
由于迭代次数是10000次,因此生成的字符串很大,并且不会显示在单行文本框中。
所以我很好奇单线文本框可以显示的最大长度。
我浏览了SO并发现了这个问题:TextBox maximum amount of characters (it's not MaxLength),它清除了一些疑问,但不是全部。我还是想知道:
Text
属性属于String
类型,当MultiLine
为false
时,为什么它甚至无法处理50k个字符?TextBox
MultiLine
时,false
可以容纳多少个字符?我们有办法获得这个号码吗?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平台注意:如果MaxLength属性设置为0,则用户可输入的最大字符数为2147483646或基于可用内存的数量,以较小者为准。
所以我做了一个实验:我创建了2个TextBox
,即textBox1
和textBox2
。 textBox2
将显示textBox1
的实时字符数。此外,我将MaxLength
的{{1}}属性更改为0
。代码如下所示:
TextBox
事实证明,当文字长度超过public Form1()
{
InitializeComponent();
textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString();
}
时,43679
完全消失了:
因此,分配给Text
属性的内存似乎可以保留在我的计算机上的43679个字符 。但我不确定这个数字对于所有计算机是否相同。我们有更复杂的方法来获得这个数字吗?
答案 0 :(得分:10)
根据我的测试,我发现文本框无法显示显示的行,因为TextBox的字体会超过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。
文字仍保存数据的全长。
更新:根据this post中的答案,此限制不是关于TextBoxes及其行,而是关于Windows控件的一般情况:
Hans Passant写道:
这是Windows中的架构限制。各种消息 指示窗口中的位置,如WM_MOUSEMOVE,报告位置 在32位整数中,X为16位,16位为 Y位置。因此,您无法创建大于的窗口 short.MaxValue。
因此,在计算其显示时,TextBox会达到该限制,并且默默地/无条件地(??)根本不显示任何内容。