我有一個文本框,它可以返回從5個字符到1000個字符長度範圍內的各種字符串。 它具有以下特性:多行文本框根據文本數量自動調整它的高度
- 多=真
- 換行=真
哪些其他的文本框的屬性,我需要設置做出以下可能嗎?
- 盒子的寬度應該是固定的
- 箱的自動高度調整取決於它是多少文字,如果文本運行到3行然後它調整到在高度爲3線返回e.g。
我有一個文本框,它可以返回從5個字符到1000個字符長度範圍內的各種字符串。 它具有以下特性:多行文本框根據文本數量自動調整它的高度
哪些其他的文本框的屬性,我需要設置做出以下可能嗎?
試試這個下面的代碼:
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;
}
}
您需要從代碼中調整文本框的高度。計算行數(this article here can help you with a way to do just that),然後將Textbox.Height
設置爲您需要的值(行數* 8px左右,具體取決於TextBox
中使用的字體)。
在鏈接文章解決方案是重寫TextBox控件類能夠獲得行數;可能還有其他方法可以獲得行數,但文章中建議的解決方案對我來說看起來相當優雅。
像這樣的東西賦予文字的高度,因爲它是如何在文本本身得出:
SizeF MessageSize = MyTextBoxControl.CreateGraphics()
.MeasureString(MyTextBoxControl.Text,
MyTextBoxControl.Font,
MyTextBoxControl.Width,
new StringFormat(0));
我不知道是什麼StringFormat
應該是但值StringFormatFlags
似乎並不適用於默認TextBox
彌補。
現在用MessageSize.Height
您知道文本框中文本的高度。
我不相信還有沒有真正優雅的方式。這是我摸不着頭腦:
textBox.Height += textBox.GetPositionFromCharIndex(textBox.Text.Length - 1).Y
+ 3 + textBox.Font.Height - textBox.ClientSize.Height;
這通過確定文本的最後一個字符的像素座標。
您可以在設置內容後執行此操作,即Form
的或TextBox
對照的OnTextChanged
。如果固定寬度在用戶調整表格的大小時發生變化,那麼您應該注意這一點,即OnResize
或OnClientSizeChanged
。
TextBox
支持AutoSize
屬性。但是,默認情況下它已被設置爲true
,並且不會在屬性編輯器或智能感知中顯示。這僅僅是字體高度的變化,並使用MultiLine = true
:(當不工作 - 這是不是在documentation
其他選項提到的可能包括使用不同的控制,如RichTextBox
或Label
我沒有嘗試呢,但似乎Label supports AutoSize好多了
我沒有看到任何'?'你有什麼問題嗎?請不要寫'我該怎麼做' –
ok - 現在編輯 – whytheq