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:
Text
è di tipo String
, perché non può nemmeno gestire i caratteri 50k quando MultiLine
è false
? TextBox
può contenere quando MultiLine
è false
? Abbiamo un modo per ottenere questo numero? 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:
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.