nev*_*ets 6 c# textbox winforms
刚才我看到了一个问题:StringBuilder不会在TextBox中显示(WinForms,C#).该帖子的作者无法在他的单行中显示他的内容,这是一个大约5万字符的字符串TextBox.
答案指出他应该改变MultiLine财产true.评论中给出了解释:
由于迭代次数为10000次,因此生成的字符串很大,并且不会显示在单行文本框中.
所以我很好奇单行文本框可以显示的最大长度.
我浏览了SO并发现了这个问题:TextBox最大字符数量(它不是MaxLength),它清除了一些疑问,但并非全部.我还是想知道:
Text物业是String类型,为什么它不能,即使处理50K人物MultiLine是false?TextBox可以容纳时MultiLine是false?我们有办法获得这个号码吗?MultiLine财产影响这种能力?对于问题2的第一部分,我做了以下事情来验证:
我怀疑这个长度与分配给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.另外,我将MaxLength属性更改0为两者TextBox.代码如下所示:
public Form1()
{
InitializeComponent();
textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString();
}
Run Code Online (Sandbox Code Playgroud)
事实证明,当文本的长度超过时43679,Text完全消失了:

因此,分配给Text属性的内存似乎可以保留在我的计算机上的43679个字符.但我不确定这个数字对于所有计算机是否相同.我们是否有更复杂的方法来获得这个数字?
TaW*_*TaW 10
从我的测试中我发现,给定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);
}
Run Code Online (Sandbox Code Playgroud)
一旦宽度超过32k,您就会看到显示消失.对于所选择的大字体,仅发生约1350个字符.这应该可以解释我们对评论的不同结果,即imo.
文本仍保留数据的全长.
更新:根据这篇文章的答案,这个限制不是关于TextBoxes及其行,而是关于Windows控件的一般情况:
Hans Passant写道:
这是Windows中的架构限制.指示窗口中位置的各种消息,如WM_MOUSEMOVE,以32位整数报告位置,X位为16位,Y位为16位.因此,您无法创建大于short.MaxValue的窗口.
因此,在计算它的显示时,TextBox会达到该限制,并且静默/ gracfully(??)根本不显示任何内容.