【问题标题】:The maximum number of characters a TextBox can displayTextBox 可以显示的最大字符数
【发布时间】: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),它消除了一些疑问,但不是全部。我还想知道:

  1. 既然Text属性是String类型,为什么MultiLinefalse时它甚至不能处理50k个字符?
  2. MultiLinefalse 时,TextBox 可以容纳多少个字符?我们有办法得到这个号码吗?
  3. 为什么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,即textBox1textBox2textBox2 将显示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。

标签: c# winforms textbox


【解决方案1】:

从我的测试中,我发现文本框无法显示在给定文本框字体的情况下超过 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 个字符中。这应该可以解释我们从 cmets 得到的不同结果,imo。

文本仍然保存数据的全部长度。

更新:根据this post 中的答案,此限制与文本框及其行无关,而是与一般的 Windows 控件有关:

汉斯·帕桑特写道:

这是 Windows 中的架构限制。各种消息 指示窗口中的位置,如 WM_MOUSEMOVE,报告位置 在一个 32 位整数中,其中 16 位用于 X,16 位用于 Y 位置。因此,您不能创建大于 短.MaxValue.

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

【讨论】:

  • 我想说这真是一个有趣而敏锐的观察。我猜32K是32767像素?你能找到任何官方的备份来进行观察吗?谢谢:D
  • 是的。如果Hans Passant's word 对我们来说是好的。。看起来这不是关于文本框和线条,而是关于控件及其尺寸以及旧的 win32 API 指针大小。
  • 好吧,我把他的话当作黄金法则,哈哈。非常感谢!您可以编辑帖子以包含他的报价吗?我认为这对追随者会更好:)
猜你喜欢
  • 2023-03-24
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
相关资源
最近更新 更多