TextBox可以显示的最大字符数

时间:2014-09-07 10:01:08

标签: c# winforms textbox

刚才我看到了一个问题:StringBuilder Won't Show In TextBox (WinForms, C#)。该帖子的作者无法在他的单行TextBox中显示他的内容,这是一个大约5万字符的字符串。

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

  

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

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

我浏览了SO并发现了这个问题:TextBox maximum amount of characters (it's not MaxLength),它清除了一些疑问,但不是全部。我还是想知道:

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

  4. 对于问题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,即textBox1textBox2textBox2将显示textBox1的实时字符数。此外,我将MaxLength的{​​{1}}属性更改为0。代码如下所示:

    TextBox

    事实证明,当文字长度超过public Form1() { InitializeComponent(); textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString(); } 时,43679完全消失了:

    43679 43680

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

1 个答案:

答案 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会达到该限制,并且默默地/无条件地(??)根本不显示任何内容。