在C#窗體中,我有一個面板錨定所有面,並在裏面,一個文本框,錨定頂部/左/右。垂直自動調整文本框控件
當文本被加載到文本框中時,我希望它自動垂直自動展開,這樣我就不需要滾動文本框(最多滾動面板,如果有更多文本不適合面板)。 有沒有辦法用文本框做到這一點? (我沒有限制使用這個控件,所以如果有另一個控件符合描述,請隨意提及它)
在C#窗體中,我有一個面板錨定所有面,並在裏面,一個文本框,錨定頂部/左/右。垂直自動調整文本框控件
當文本被加載到文本框中時,我希望它自動垂直自動展開,這樣我就不需要滾動文本框(最多滾動面板,如果有更多文本不適合面板)。 有沒有辦法用文本框做到這一點? (我沒有限制使用這個控件,所以如果有另一個控件符合描述,請隨意提及它)
我假設這是一個多行文本框,並允許它垂直增長。此代碼運行良好:
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屬性),您應該做一些合理的事情。
您可以使用Label並將AutoSize設置爲true
。
我認爲自動調整爲水平。我錯了嗎? – 2010-05-24 04:47:56
您可以將其錨定到底部,這將確保文本框在調整大小時將其垂直調整大小。 此外,更改其大小的文本框可能不是一件好事,因爲它可能會破壞其他組件的顯示方式。爲什麼不給它一個最大尺寸而不是調整大小?
我建議使用Graphics.MeasureString
。
首先你創建一個Graphics
對象,然後調用MeasureString
,傳遞字符串和文本框的字體。
例
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
屬性並使用重載MeasureString
也接受int width
限制爲垂直軸。
編輯
由於SLaks指出,另一種選擇是使用TextRenderer.MeasureString
。這樣就不需要創建一個Graphics
對象。
textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize();
在這裏,您可以用漢族的技術限制在垂直調整大小,通過一個額外的Size
參數MeasureString
與int.MaxValue
高度。
你忘了處理'g'。你應該調用'TextRenderer.MeasureString'。 – SLaks 2010-05-23 19:52:44
當前選擇的答案不處理,不帶空格線,如「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;
}
這個人像魔術一樣工作。 – docesam 2015-10-23 20:23:34
嘗試這種方法:
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>
像魅力一樣工作 – 2010-05-24 05:09:37
它工作,但不處理沒有空格的行。大衛寫的句柄 – docesam 2015-10-23 20:24:15
@Hans Passant如果是單行文本框呢? – 707 2016-07-15 05:23:56