2010-05-23 57 views
14

在C#窗體中,我有一個面板錨定所有面,並在裏面,一個文本框,錨定頂部/左/右。垂直自動調整文本框控件

當文本被加載到文本框中時,我希望它自動垂直自動展開,這樣我就不需要滾動文本框(最多滾動面板,如果有更多文本不適合面板)。 有沒有辦法用文本框做到這一點? (我沒有限制使用這個控件,所以如果有另一個控件符合描述,請隨意提及它)

回答

25

我假設這是一個多行文本框,並允許它垂直增長。此代碼運行良好:

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屬性),您應該做一些合理的事情。

+0

像魅力一樣工作 – 2010-05-24 05:09:37

+0

它工作,但不處理沒有空格的行。大衛寫的句柄 – docesam 2015-10-23 20:24:15

+0

@Hans Passant如果是單行文本框呢? – 707 2016-07-15 05:23:56

2

您可以使用Label並將AutoSize設置爲true

+1

我認爲自動調整爲水平。我錯了嗎? – 2010-05-24 04:47:56

0

您可以將其錨定到底部,這將確保文本框在調整大小時將其垂直調整大小。 此外,更改其大小的文本框可能不是一件好事,因爲它可能會破壞其他組件的顯示方式。爲什麼不給它一個最大尺寸而不是調整大小?

2

我建議使用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參數MeasureStringint.MaxValue高度。

+1

你忘了處理'g'。你應該調用'TextRenderer.MeasureString'。 – SLaks 2010-05-23 19:52:44

25

當前選擇的答案不處理,不帶空格線,如「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; 
} 
+0

這個人像魔術一樣工作。 – docesam 2015-10-23 20:23:34

0

嘗試這種方法:

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>