垂直自动调整文本框控件的大小

在一个C#的forms,我有一个面板锚定所有的侧面,里面,一个文本框,锚定顶部/左/右。

当文本被加载到文本框中时,我希望它自动垂直自动展开,这样我就不需要滚动文本框(最多滚动面板,如果有更多文本不适合面板)。 有没有办法用文本框做到这一点? (我没有限制使用这个控件,所以如果有另一个适合描述的控件,可以随意提及它)

我会假设这是一个多行文本框,你会让它垂直增长。 这段代码运行良好:

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

当文本框为空时,你应该做一些合理的事情,比如设置MinimumSize属性。

当前select的答案不处理没有空格的行,例如“jjjjjjjjjjjjjjjjjjjj”x1000(想想如果有人粘贴了一个URL会发生什么)

这段代码解决了这个问题:

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

您可以使用标签,并将AutoSize设置为true

我build议使用Graphics.MeasureString

首先创build一个Graphics对象,然后调用MeasureString ,传递string和文本框的字体。

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

你也可以通过设置textBox.Size.Height属性和使用也接受int widthMeasureString重载来限制它的垂直轴。

编辑

正如SLaks指出的,另一种select是使用TextRenderer.MeasureString 。 这样就不需要创build一个Graphics对象。

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

在这里,您可以限制使用Hans的技术进行垂直调整,使用int.MaxValue高度将一个额外的Sizeparameter passing给MeasureString

您可以将其锚定到底部,这将确保文本框在resize的窗体时垂直resize。 此外,改变其大小的文本框可能不是一个优雅的东西,因为它可能会破坏其他组件的显示方式。 为什么不给它一个最大的大小,而不是resize?

尝试这种方法:

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

aspx代码

 <asp:TextBox ID="txtValue" TextMode="MultiLine" Text='<%# Eval("Value") %>' runat="server" MaxLength="500" Width="700px" Rows='<%# GetRows(Eval ("Value")) %>' ></asp:TextBox>