2012-05-13 37 views
7

我有一個文本框,它可以返回從5個字符到1000個字符長度範圍內的各種字符串。 它具有以下特性:多行文本框根據文本數量自動調整它的高度

  • 多=真
  • 換行=真

哪些其他的文本框的屬性,我需要設置做出以下可能嗎?

  • 盒子的寬度應該是固定的
  • 箱的自動高度調整取決於它是多少文字,如果文本運行到3行然後它調整到在高度爲3線返回e.g。
+2

我沒有看到任何'?'你有什麼問題嗎?請不要寫'我該怎麼做' –

+0

ok - 現在編輯 – whytheq

回答

6

試試這個下面的代碼:

public partial class Form1 : Form 
{ 
    private const int EM_GETLINECOUNT = 0xba; 
    [DllImport("user32", EntryPoint = "SendMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
    private static extern int SendMessage(int hwnd, int wMsg, int wParam, int lParam); 


    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     var numberOfLines = SendMessage(textBox1.Handle.ToInt32(), EM_GETLINECOUNT, 0, 0); 
     this.textBox1.Height = (textBox1.Font.Height + 2) * numberOfLines; 
    } 
} 
+0

如果文本框使用自定義字體使用'textBox1.Height =(textBox1.Font.Height + 2)* numberOfLines;' – George

+0

Thanks George!Post updated。 –

+1

...我會更好地使用不同的控件比文本框嗎?的控件是否在其屬性中內置了此功能? – whytheq

1

您需要從代碼中調整文本框的高度。計算行數(this article here can help you with a way to do just that),然後將Textbox.Height設置爲您需要的值(行數* 8px左右,具體取決於TextBox中使用的字體)。

在鏈接文章解決方案是重寫TextBox控件類能夠獲得行數;可能還有其他方法可以獲得行數,但文章中建議的解決方案對我來說看起來相當優雅。

3

似乎沒有任何功能可以對TextBox類進行內置操作,但Font類具有返回基線之間像素數的Height屬性。

也可以找出文本框中的文本佔據了多少行,如this博客文章中所述(警告:它不完美)。

一旦你獲得了這些信息,你應該能夠使TextChanged處理程序相應地使用一些簡單的數學運算來設置TextBox的高度。

1
private void tb_TextChanged(object sender, EventArgs e) 
{ 
    tb.Height = (tb.Text.Split('\n').Length + 2) * tb.Font.Height; 
} 
+0

+1感謝Vlad在這樣一個老問題上的額外信息 – whytheq

+0

現在,高度自動調整到表單的錨定似乎不工作:文本框有時比表格大,所以我看不到文本框的底部。有任何想法嗎? – whytheq

0

像這樣的東西賦予文字的高度,因爲它是如何在文本本身得出:

SizeF MessageSize = MyTextBoxControl.CreateGraphics() 
           .MeasureString(MyTextBoxControl.Text, 
               MyTextBoxControl.Font, 
               MyTextBoxControl.Width, 
               new StringFormat(0)); 

我不知道是什麼StringFormat應該是但值StringFormatFlags似乎並不適用於默認TextBox彌補。

現在用MessageSize.Height您知道文本框中文本的高度。

0

我不相信還有沒有真正優雅的方式。這是我摸不着頭腦:

textBox.Height += textBox.GetPositionFromCharIndex(textBox.Text.Length - 1).Y 
    + 3 + textBox.Font.Height - textBox.ClientSize.Height; 

這通過確定文本的最後一個字符的像素座標。

您可以在設置內容後執行此操作,即Form的或TextBox對照的OnTextChanged。如果固定寬度在用戶調整表格的大小時發生變化,那麼您應該注意這一點,即OnResizeOnClientSizeChanged

TextBox支持AutoSize屬性。但是,默認情況下它已被設置爲true,並且不會在屬性編輯器或智能感知中顯示。這僅僅是字體高度的變化,並使用MultiLine = true :(當不工作 - 這是不是在documentation

其他選項提到的可能包括使用不同的控制,如RichTextBoxLabel我沒有嘗試呢,但似乎Label supports AutoSize好多了

相關問題