垂直自动调整文本框控件的大小
在一个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 width
的MeasureString
重载来限制它的垂直轴。
编辑
正如SLaks指出的,另一种select是使用TextRenderer.MeasureString
。 这样就不需要创build一个Graphics
对象。
textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize();
在这里,您可以限制使用Hans的技术进行垂直调整,使用int.MaxValue
高度将一个额外的Size
parameter 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>