Autoresize controllo casella di testo in verticale

In un modulo C #, ho un pannello ancorato su tutti i lati e all’interno, una casella di testo, ancorata in alto / a sinistra / a destra.

Quando il testo viene caricato nella casella di testo, voglio che si espanda automaticamente verticalmente in modo che non sia necessario scorrere la casella di testo (far scorrere il pannello al massimo, se c’è più testo che non si adatta al pannello). c’è un modo per farlo con una casella di testo? (Non sono costretto a usare questo controllo, quindi se c’è un altro controllo che si adatta alla descrizione, sentitevi liberi di menzionarlo)

Immagino che questa sia una casella di testo su più righe e che tu le consenta di crescere verticalmente. Questo codice ha funzionato bene:

private void textBox1_TextChanged(object sender, EventArgs e) { Size sz = new Size(textBox1.ClientSize.Width, int.MaxValue); TextFormatFlags flags = TextFormatFlags.WordBreak; int padding = 3; int borders = textBox1.Height - textBox1.ClientSize.Height; sz = TextRenderer.MeasureText(textBox1.Text, textBox1.Font, sz, flags); int h = sz.Height + borders + padding; if (textBox1.Top + h > this.ClientSize.Height - 10) { h = this.ClientSize.Height - 10 - textBox1.Top; } textBox1.Height = h; } 

Dovresti fare qualcosa di ragionevole quando la casella di testo è vuota, come l’impostazione della proprietà MinimumSize.

La risposta selezionata corrente NON gestisce le linee senza spazi come “jjjjjjjjjjjjjjjjjjjj” x1000 (pensa a cosa accadrebbe se qualcuno incollasse un URL)

Questo codice risolve questo problema:

 private void txtBody_TextChanged(object sender, EventArgs e) { // amount of padding to add const int padding = 3; // get number of lines (first line is 0, so add 1) int numLines = this.txtBody.GetLineFromCharIndex(this.txtBody.TextLength) + 1; // get border thickness int border = this.txtBody.Height - this.txtBody.ClientSize.Height; // set height (height of one line * number of lines + spacing) this.txtBody.Height = this.txtBody.Font.Height * numLines + padding + border; } 

È ansible utilizzare un’etichetta e impostare AutoSize su true .

Suggerirei di usare Graphics.MeasureString .

Per prima cosa create un object Graphics , quindi chiamate MeasureString su di esso, passando la stringa e il carattere della casella di testo.

Esempio

 string text = "TestingTesting\nTestingTesting\nTestingTesting\nTestingTesting\n"; // Create the graphics object. using (Graphics g = textBox.CreateGraphics()) { // Set the control's size to the string's size. textBox.Size = g.MeasureString(text, textBox.Font).ToSize(); textBox.Text = text; } 

Puoi anche limitarlo all’asse verticale impostando solo la proprietà textBox.Size.Height e utilizzando l’overload MeasureString che accetta anche int width .

modificare

Come sottolineato da SLaks, un’altra opzione sta usando TextRenderer.MeasureString . In questo modo non è necessario creare un object Graphics .

 textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize(); 

Qui puoi limitare il ridimensionamento verticale usando la tecnica di Hans, passando un parametro extra Size a MeasureString con altezza int.MaxValue .

Puoi ancorarlo in fondo, in modo che la casella di testo venga ridimensionata verticalmente quando la forma a cui appartiene viene ridimensionata. Inoltre, una casella di testo che cambia le sue dimensioni potrebbe non essere una cosa elegante in quanto potrebbe interrompere il modo in cui vengono visualizzati gli altri componenti. Perché non le dai la dimensione massima invece di ridimensionarla?

Prova questo approccio:

codice aspx.cs

 protected int GetRows(object value) { if (value == null || string.IsNullOrWhiteSpace(value.ToString())) return 1; var contentTrimmed = value.ToString().Replace('\t', ' ').Replace('\r', ' ').Replace('\n', ' ').Trim(); var length = (decimal)contentTrimmed.Length; if (length == 0) return 1; int res = 0; decimal maxLength = 56; using (System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(new Bitmap(1, 1))) { SizeF sizeRef = graphics.MeasureString("W", new Font("Segoe UI", 13, FontStyle.Regular, GraphicsUnit.Pixel)); maxLength = maxLength * (decimal)sizeRef.Width; SizeF size = graphics.MeasureString(contentTrimmed, new Font("Segoe UI", 13, FontStyle.Regular, GraphicsUnit.Pixel)); length = (decimal)size.Width; } res = (int)Math.Round(length / (decimal)maxLength, MidpointRounding.AwayFromZero); if (res == 0) return 1; return res; } 

codice aspx