Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文本框可以显示的最大字符数_C#_Winforms_Textbox - Fatal编程技术网

C# 文本框可以显示的最大字符数

C# 文本框可以显示的最大字符数,c#,winforms,textbox,C#,Winforms,Textbox,刚才我看到一个问题:。这篇文章的作者无法在他的单行文本框中显示他的内容,这是一个大约50k个字符的字符串 答案指出他应该将多行属性更改为true。评论中的一项解释说: 由于迭代次数为10000次,因此生成的字符串很大,不会显示在单行文本框中 因此,我对单行文本框可以显示的最大长度感到好奇 我浏览了一下,发现了这个问题:,它澄清了一些疑问,但不是全部。我还是想知道: 既然Text属性是String类型,为什么当多行为false时,它甚至不能处理50k个字符 当多行为假时,文本框可以容纳多少个字符?

刚才我看到一个问题:。这篇文章的作者无法在他的单行
文本框
中显示他的内容,这是一个大约50k个字符的字符串

答案指出他应该将
多行
属性更改为
true
。评论中的一项解释说:

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

因此,我对单行文本框可以显示的最大长度感到好奇

我浏览了一下,发现了这个问题:,它澄清了一些疑问,但不是全部。我还是想知道:

  • 既然
    Text
    属性是
    String
    类型,为什么当
    多行
    false
    时,它甚至不能处理50k个字符
  • 多行
    时,
    文本框
    可以容纳多少个字符?我们有办法得到这个号码吗
  • 为什么
    多行
    属性会影响此功能

  • 对于问题2第一部分,我做了以下事情来验证:

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

    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();
    }
    
    结果是,当文本长度超过
    43679
    时,
    text
    完全消失:


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

    从我的测试中,我发现一个文本框不能显示超过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);
    } 
    
    public Form1()
    {
    初始化组件();
    textBox1.Font=新系统.Drawing.Font(“控制台”,32f);
    G=textBox1.CreateGraphics();
    对于(inti=0;i<100;i++)textBox1.Text++=i.ToString(“0123456789”);
    }
    图形G;
    私有无效按钮2\u单击(对象发送者,事件参数e)
    {   
    对于(inti=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

    文本仍然保存数据的完整长度

    更新:根据此限制中的答案,与其说是关于文本框及其行,不如说是关于Windows控件:

    汉斯·帕桑写道:

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


    因此,在计算其显示时,文本框达到了该限制,并且无声地/完全地(??)不显示任何内容。

    我无法在您提到的帖子中重现该问题。你能?如果是,您的设置是什么?文本框可以容纳更多的文本。我看到您使用的是单行文本框。一条可见的单行线的长度很可能有一个限制1.我可以复制。我认为这是因为我提到的第二个问题:分配给单行TextBox的
    Text
    属性的内存超过了50K,而我的只有43K。我可以重现,TextBox显示的行长度不会超过6120个字符。它可以容纳任何长度,但不会显示这么长的行。嗯,对我来说,它最多可以显示43K个字符,就像我在问题中发布的图片。我在测试中看到一些奇怪的差异,这取决于我添加文本的方式。但它总是在那里,只是看不见。。可能是因为字体的原因更新:是的,这是字体!看起来得到的宽度不能超过32k。我想说,这真是一个有趣而尖锐的观察结果。我猜32K应该是32767像素?你能为你的观察找到官方的证据吗?谢谢:染料。如果英语对我们来说是好的。。看起来这并不是关于文本框和行,而是关于控件和它们的尺寸,还有关于旧的win32 API指针大小。我把他的话当作黄金法则哈哈。非常感谢!你能把这篇文章编辑成包括他的引文吗?我觉得对粉丝来说会更好:)