我有一个文本框,可以返回各种字符串,长度从5个字符到1000个字符不等。 它具有以下属性:
我需要设置哪些文本框的其他属性才能实现以下功能?
答案 0 :(得分:8)
请尝试以下代码:
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;
}
}
答案 1 :(得分:3)
似乎没有任何功能可以在TextBox类中内置它,但Font类有一个Height属性,它返回基线之间的像素数。
也可以找出TextBox中文本占用的行数,如this博文中所述(警告:它不是很优雅)。
获得此信息之后,您应该能够使用一些简单的数学使TextChanged处理程序相应地设置TextBox的高度。
答案 2 :(得分:1)
您需要从代码中调整文本框的高度。计算行数(this article here can help you with a way to do just that),然后将Textbox.Height
设置为您需要的值(行数* 8px左右,具体取决于TextBox
内使用的字体)。< / p>
在链接文章解决方案是覆盖TextBox控件类,以便能够获得行数;可能还有其他方法可以获得行数,但文章中建议的解决方案看起来非常优雅。
答案 3 :(得分:1)
private void tb_TextChanged(object sender, EventArgs e)
{
tb.Height = (tb.Text.Split('\n').Length + 2 ) * tb.Font.Height;
}
答案 4 :(得分:1)
在TextBox上添加MaxHeight属性,如下所示。
<TextBox Name="txtSample" MaxHeight="1000" />
答案 5 :(得分:0)
这样的东西给出了文本的高度,就像它在文本框中的绘制方式一样:
SizeF MessageSize = MyTextBoxControl.CreateGraphics()
.MeasureString(MyTextBoxControl.Text,
MyTextBoxControl.Font,
MyTextBoxControl.Width,
new StringFormat(0));
我不确定StringFormat
应该是什么,但值StringFormatFlags
似乎不适用于默认的TextBox
化妆。
现在使用MessageSize.Height
,您就知道文本框中文本的高度。
答案 6 :(得分:0)
我无法相信仍然没有真正优雅的方式。这就是我困惑的事情:
textBox.Height += textBox.GetPositionFromCharIndex(textBox.Text.Length - 1).Y
+ 3 + textBox.Font.Height - textBox.ClientSize.Height;
这可以通过确定文本最后一个字符的像素坐标来实现。
您可以在设置内容后执行此操作,即OnLoad
或Form
OnTextChanged
控件的TextBox
。如果在用户调整表单大小时固定宽度发生变化,您还应该注意这一点,即OnResize
或OnClientSizeChanged
。
TextBox
支持AutoSize
属性。但是,默认情况下它已设置为true
,并且未在属性编辑器或IntelliSense中显示。它仅用于字体高度更改,在使用MultiLine = true
时不起作用:( - documentation中未提及。
其他选项可能包括使用其他控件,例如RichTextBox
或Label
。我还没有尝试过,但似乎Label supports AutoSize好多了。