多行文本框根据文本量自动调整高度

时间:2012-05-13 20:33:11

标签: c# winforms

我有一个文本框,可以返回各种字符串,长度从5个字符到1000个字符不等。 它具有以下属性:

  • multiline = true
  • wordwrap = true

我需要设置哪些文本框的其他属性才能实现以下功能?

  • 框的宽度应该是固定的
  • 要自动调整的框的高度取决于它返回的文本数量,例如,如果文本运行到3行,则它将调整为3行高度。

7 个答案:

答案 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;

这可以通过确定文本最后一个字符的像素坐标来实现。

您可以在设置内容后执行此操作,即OnLoadForm OnTextChanged控件的TextBox。如果在用户调整表单大小时固定宽度发生变化,您还应该注意这一点,即OnResizeOnClientSizeChanged

TextBox支持AutoSize属性。但是,默认情况下它已设置为true,并且未在属性编辑器或IntelliSense中显示。它仅用于字体高度更改,在使用MultiLine = true时不起作用:( - documentation中未提及。

其他选项可能包括使用其他控件,例如RichTextBoxLabel。我还没有尝试过,但似乎Label supports AutoSize好多了。