Il numero massimo di caratteri che un TextBox può visualizzare

Proprio ora ho visto un problema: StringBuilder non verrà visualizzato in TextBox (WinForms, C #) . L’autore del post non può mostrare il suo contenuto, che è una stringa di circa 50k caratteri, nel suo TextBox riga singola.

La risposta ha indicato che dovrebbe cambiare la proprietà MultiLine su true . Una spiegazione ha dato nel commento dichiarato:

Poiché l’iterazione è 10000 volte, la stringa generata è grande e non viene visualizzata in una casella di testo a riga singola.

Quindi sono curioso della lunghezza massima che può contenere una casella di testo a riga singola .

Ho sfogliato SO e ho trovato questa domanda: TextBox quantità massima di caratteri (non è MaxLength) , cancella alcuni dubbi, ma non tutti. Voglio ancora sapere:

  1. Poiché la proprietà Text è di tipo String , perché non può nemmeno gestire i caratteri 50k quando MultiLine è false ?
  2. Quanti caratteri un TextBox può contenere quando MultiLine è false ? Abbiamo un modo per ottenere questo numero?
  3. Perché la proprietà MultiLine influisce su questa capacità?

Per la prima domanda della seconda parte, ho fatto le seguenti cose per verificare:

Sospettavo che questa lunghezza fosse correlata alla memoria allocata alla proprietà Text . Ho fatto qualche ricerca online e questa documentazione MSDN mi ha dato alcuni spunti:

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, piattaforma Windows Server 2003 Nota: se la proprietà MaxLength è impostata su 0, il numero massimo di i caratteri che l’utente può inserire è 2147483646 o un importo basato sulla memoria disponibile, a seconda di quale è più piccolo.

Così ho fatto un esperimento: ho creato 2 TextBox , vale a dire textBox1 e textBox2 . textBox2 mostrerà il conteggio dei caratteri in tempo reale di textBox1 . Inoltre, ho modificato la proprietà MaxLength su 0 per entrambi i TextBox . Il codice si presenta così:

 public Form1() { InitializeComponent(); textBox1.TextChanged += (s, e) => textBox2.Text = textBox1.Text.Length.ToString(); } 

Si è scoperto che quando la lunghezza del testo supera 43679 , il Text completamente scomparso:

4367943680

Quindi sembra che la memoria allocata alla proprietà Text possa contenere 43679 caratteri sul mio computer . Ma non sono sicuro che questo numero sia uguale per tutti i computer. Abbiamo un modo più sofisticato per ottenere questo numero?

Grazie in anticipo!

Dai miei test, trovo che una casella di testo non può mostrare linee che superano i 32k pixel, dato il carattere del TextBox.

Usando questo piccolo banco di prova

 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); } 

Puoi vedere che il display scompare quando la larghezza supera 32k. Per il grande carattere scelto questo succede con solo circa 1350 caratteri. Questo dovrebbe spiegare i nostri diversi risultati dai commenti, imo.

Il testo conserva ancora l'intera lunghezza dei dati.

Aggiornamento : Secondo le risposte in questo post, questo limite non riguarda tanto i TextBox e le loro linee, ma i controlli di Windows in generale:

Hans Passant scrive:

Questa è una limitazione architettonica in Windows. Vari messaggi che indicano posizioni in una finestra, come WM_MOUSEMOVE, riportano la posizione in un numero intero a 32 bit con 16 bit per X e 16 bit per la posizione Y. Pertanto non è ansible creare una finestra più grande di short.MaxValue.

Quindi, quando calcola il suo display, il TextBox raggiunge quel limite e silenziosamente / in modo soddisfacente (??) non mostra nulla.