C#调整文本框大小以适合内容

时间:2011-11-08 09:44:12

标签: c# textbox resize

我正在编写一个程序,用户应该可以在文本框中编写文本。我希望文本框能够自行调整大小,因此它适合内容。 我尝试了以下内容:

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
    System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
    System.Drawing.SizeF mySize = e.Graphics.MeasureString("This is a test", myFont);
    this.textBoxTitle.Width = (int)Math.Round(mySize.Width, 0);
}

我收到错误,说明图形不适用于TextChangedEventArgs。还有其他方法可以调整文本框的大小吗?

10 个答案:

答案 0 :(得分:54)

你应该尝试类似下面的代码。它对我有用。

private void textBox1_TextChanged(object sender, EventArgs e)
{
  Size size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
  textBox1.Width = size.Width;
  textBox1.Height = size.Height;
}

有关更多信息,请参阅TextRenderer.MeasureText()

答案 1 :(得分:6)

我正在添加此答案,因为我没有看到任何其他文本框中的fixed width方面正在讨论。如果文本框的宽度固定,并且只想调整其高度,则可以执行以下操作:

这样的内容给出了文本的高度,就像它在多行文字包装文本框中的绘制方式一样:

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

我不确定StringFormat应该是什么,但值StringFormatFlags似乎不适用于默认的TextBox化妆。

现在使用MessageSize.Height,您就知道文本框中文本的高度。

答案 2 :(得分:4)

您绑定到错误的事件,并且您无法在TextChangedEventArgs对象中使用图形对象。

尝试使用TextChanged事件。以下代码段正在运行:

public Form1()
{
    InitializeComponent();

    this.textBox1.TextChanged += new EventHandler(textBox1_TextChanged);
}

void textBox1_TextChanged(object sender, EventArgs e)
{
    System.Drawing.SizeF mySize = new System.Drawing.SizeF();

    // Use the textbox font
    System.Drawing.Font myFont = textBox1.Font;

    using (Graphics g = this.CreateGraphics())
    {
        // Get the size given the string and the font
        mySize = g.MeasureString(textBox1.Text, myFont);
    }

    // Resize the textbox 
    this.textBox1.Width = (int)Math.Round(mySize.Width, 0);
}

}

答案 3 :(得分:3)

我遇到了同样的问题,我以更简单的方式解决了这个问题。

我使用了Label控件的AutoSize属性。我在表单中添加了一个不可见的标签,将其AutoSize属性设置为True。当我需要更改TextBox的大小时,我使用以下代码:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00\x1a\x00\x14\x00\x00\xff\xfe\x00!LENEL OnGuard Chromakey=23,3,30\xff\xdb\x00C\x00\x08\x05\x06\x07\x06\x05\x08\x07\x06\x07\t\x08\x08\t\x0c\x13\x0c\x0c\x0b\x0b\x0c\x18\x11\x12\x0e\x13\x1c\x18\x1d\x1d\x1b\x18\x1b\x1a\x1f#,%\x1f!*!\x1a\x1b&4\'*./121\x1e%6:60:,010\xff\xdb\x00C\x01\x08\t\t\x0c\n\x0c\x17\x0c\x0c\x170 \x1b 00000000000000000000000000000000000000000000000000\xff\xc0\x00\x11\x08\x00P\x00<\x03\x01!\x00\x02\x11\x01\x03\x11\x01\xff\xc4\x00\x1c\x00\x00\x01\x04\x03\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x06\x02\x04\x05\x07\x00\x01\x03\x08\xff\xc4\x003\x10\x00\x02\x01\x03\x02\x04\x03\x07\x03\x04\x03\x00\x00\x00\x00\x00\x01\x02\x03\x00\x04\x11\x05!\x06\x121A\x07\x13\x81\x14"QRaq\xa12\xb1\xc1#3\xd1\xe1Cr\x91\xff\xc4\x00\x19\x01\x00\x03\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x03\x00\x04\x05\xff\xc4\x00\x1e\x11\x00\x03\x01\x01\x01\x00\x03\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x11!\x03\x12"1AQ\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00)\rK\rS\x08\xc3[\xd7\xf4\xcd\x06\xd8O\xaa\xdd$\n\xdf\xa1N\xec\xff\x00\xf5Q\xb9\xa0\xab\xbf\x18\xb4\xe5b-4\xcb\xa9Tt.\xca\x99\xfd\xe9\x920\xa8\xbc`\xb0i\xe3V\xb1\x99"8\xe6c\x82W\xd3\xbf\xa5X\x9a^\xa1m\xa9\xd9\xc7ug*\xcb\x14\x802\xb2\x9c\x82(\x80wY\x8a\x06"CTo\x13\xeb\xd0\xf0\xfe\x8bq\x7f0\xe6(1\x1a|\xeez\nD1\xe7\xdd[V\xbb\xd65\tou\t\x8c\xd3\xcaw\'\xa0\x1d\x80\x1d\x80\xf8V\xac\xac\xe6\xb8\xdd\x10\x95\x07s\xda\xa8\xde $\xdb\xc4j\xfe\x17\xb7\xb8a"\x95\x0cr(\xdf\xc2N*\x93J\xd5\x97K\xb9rm/\x1b\t\x9f\xf8\xe4\xed\x8f\xa3t?\\\x1a\xcb\xa8\xcdc\xc2\xf1V\x0c\xa0\x83\x90w\x14\xac\xd0\x01\n\x1f\x15Tx\xcf\xab4\xda\x8d\xa6\x97\x1be O5\xc0\xf9\x9b\xa7\xfe\x0f\xde\x92\x7fF`\xde\x8b\xa6\xc4\x80<\xf0\xac\xb2\x1d\xf0\xdb\x85\xa2\x1b~TnU\x89W=\xb1S\xaa\xd6uD\xfcP\xd3Z\xb0[\xcbv^P\x1cn\xbfz\x0eS-\xad\xc6\xc4\xa4\x910`~\x04\x1d\xaa\xbeo\x98C\xd5wOK\xf0\x9e\xa6\xba\xb7\x0f\xd9^\xa9\xdeh\x830\xf87\x7f\xcej_4\xc4\x88\x1el\x0c\xd5\x17\xc5\xceo8\xe6\xf3\x9c\x92\r\xc0O@\x00\xfe)$a\x13\xeaW\x10\xc9\xcb\x01\x18\x07\x97\x02.\xff\x00|\xe6\xa4\x12\xf6\xe5\xf4\xdfiX\xceF\xd9\xc7zW(\xbc\xdb\xea\x1bZ\xeawl\xe4\\K6\xc4{\xa25\xc6\xfd6\xc6\xf4\xc7\x89m\xbc\xbb\x88\xa6Q\xfd\xd5\xdfn\xe2\x9dq\x93\xa6\xda\xe9k\xf8%v\xd3p\xb3\xc2I>\xcf; \xfa\x03\x86\xfej\xc1\rLH\x80v\xc0\xaa?\x88\x7f\xa5\xc7wx\xdc\x0b\xa2})\x17\xf4bZ\xe5t\xe4\x8c\xcd*\x13(\xdb\x01\x8e\t\xfbS\xd8\xa4\x85t\xc5Q\xc8\xcd\x92Y2?\x15,gf$"\xc8im\x99 \x88+\xfc\xa4\x9d\xbd*+\x89\x07\x9d#0\x1e\xecP\xb3\xfd\xbb\ny_\xe9?L\xce\x06>\x05M\x8d/R\x88\xf6\x9d\x18z\xa9\xff\x00\x15f\xf3\xd5NPv\xe6nU5Hq\x8b\xb2\xf1]\xfb\x83\xef\t\xb2\x08\xfb\nY\x19\x8fp\'1\\\xc0\xca\xe5\x86y[\xa0\xff\x00u)kc\n\x11)\x9a z\x81\xe59\xc7\xa7\xe9\xfc\xd2\xa4t\xae\xff\x004\xe6 "\xf4\xcd;(c\x9d\x90`\x11\xdb?Z\x1e\xe2+\xcf?Pt\x89\xcf\x96\x8a\x10\xe0\xecM\x19\xeb\'\xe9\xc4Y\xde\x0bY\xb4\x1a\r\xcd\xdbl.%\xc2\xfd\x97\xfd\x9a?\xe6\xa7 \x07\xcf\x7f\x14\xe5\x84.\x1c\x8e\xa0v\xdf\x1f\xb8"\xa9\xbe!\x94O\xad\xdeH\x180i[q\xde\x84\x85\x8b\xd1\xaeZ7(\xd9h\xfa\xe3\xe1\xf6\xa9\xdb{\x8d0\x1ew2\xf3u\xfe\xe1\x1f\x8aJOx_\xcd\xac\xe8\x8b\xbb\xbf8\x9f \x14\x8c\x0e\xa6\x85\x9c\xe6F?\x12M4,\'}\r\xfc>\xe3\x11\xa2)\xb3\xbec\xec\x84\xe5O^C\xdf\xd2\xad\x0b^!\xd3\xaeaY`\xbb\x85\xd0\xf4!\xc510+T\xe05\x96\xf2{\x88/\xee\x90\xcc\xec\xea\x91\x80\x15\t\xeb\xbeh\x03R\xd0/l\xe6th_\xdcb\xa7=i\x9f\xd7\xf4\xd3\xf6\xfc:X\xd8\xb4`\x13\xd4\xf5\xa7\x9e\xc5\xce\xdb.\xf5\xce\xebY\xd2\xa7\x98;[\x12`*F20j\x0eM\x12\xe0\xbb\x18\x80#\xa8\x07\xe1Fk?E\xa9\xd5\xc1\x84\xb6\xf3\xa4\xdeT\x912\xbf\xcb\x8a\xeb\r\x8d\xdc\xc9\xcf\r\xb4\x8e\xbd2\xaaqV z\x1c "\xa3\xb5]\x1a\x1b\xe5\xe6a\xcb \x18\x0e\x06}\x08\xefV\xa8\xf9,\'\x17\xf1z\t\xdfp\xdd\xcc.H\x80\xb2|\xd1\x8ea\xf8\xae0\xd9\xac?\xa8`\xfdEy\xf75/\x19\xe8K\x9a\xea\x1cG\xa7\xc9pyb\x85\xdc\x9f\x95I\xa9-?\x84\xdc\x9ek\xa7\x11\x8f\x95}\xe6\xff\x00\x02\x9f\xcf\xca\xac_OI\x80\x86\xd7B\xd3\xe0\x8b\x91m\x91\x89\x18,\xe3\x99\x9b\xee\x7f\x8au\x05\x8d\xb5\xacK\x0c\x11$Q\xafEQ\x80+\xbdJK\x11\xe7\xbat\xf5\x98\x84`R\xe8\x98\xd1PNq\xbf\xc6\xb3\x90\x1f\x8f\xa9\xcd\x10\n\xe5\x18\xc6\xe4}M(\n\xc6:\x0f\xd4\x07\xadq\x98\x90\xf4L\x7f\xff\xd9'

我设置标签的最大和最小尺寸以获得更好的效果。 玩得开心

答案 4 :(得分:1)

您需要使用表单的CreateGraphics()方法来创建Graphics实例来测量字符串。

TextChangedEventArgs类没有Graphics属性,这是传递给PaintEventArgs事件处理程序的Paint类的属性

答案 5 :(得分:1)

试试这个:

using System.Drawing;
...

private void textBoxTitle_TextChanged(object sender, TextChangedEventArgs e)
{
    // Determine the correct size for the text box based on its text length   

    // get the current text box safely
    TextBox tb = sender as TextBox;
    if (tb == null) return;

    SizeF stringSize;

    // create a graphics object for this form
    using(Graphics gfx = this.CreateGraphics())
    {
        // Get the size given the string and the font
        stringSize = gfx.MeasureString(tb.Text, tb.Font);
    }

    // Resize the textbox 
    tb.Width = (int)Math.Round(stringSize.Width, 0);

}

基本上,您为表单创建自己的Graphics对象,然后根据TextBox的文本和字体进行测量。 using将正确处理Graphics对象 - 您之前的代码可能会泄露严重!

答案 6 :(得分:0)

您是否尝试设置yourTextBox.AutoSize = true;? 此属性可能隐藏在GUI设计器中,但您可以在InitializeComponent();调用后立即在表单构造函数中设置它。

答案 7 :(得分:0)

Graphics.Measure字符串你可以做 PaintEventArgs ,而不是 TextChangedEventArgs

我认为你想要的是这个

System.Drawing.Font myFont = new System.Drawing.Font("Verdana", 8);
Graphics graphics = this.CreateGraphics();
SizeF textSize = graphics.MeasureString("This is a test", myFont);

问题是你只是因为它没有公共构造函数而无法通过简单地分配它来创建一个 Graphics 对象,所以你最好去使用TextRenderer.MeasureText,就像{{3}中所做的那样。 }

TextRenderer不太准确,因为它使用GDI而Graphics使用GDI +,所以也许你应该在Width属性的值上留一点余地。

希望这有帮助

答案 8 :(得分:0)

无论目标是什么。

如果文本框的大小应该根据字符串动态设置,该字符串应该是此框中的文本,没有不错的选项

原因: MeasureString使用常用的字符串格式化程序作为其自身宽度和高度的分隔符。 手段,回车和换行也被解析。导致sizeF.Width和sizeF.Height。

根据字符串(及其字体和行数),这两个变量都可以携带值,这些值有时无用作文本框的宽度/高度值(因为它们可能比父图形更大#39; s值,这会将文本框的大小调整为一个大小,左边框和底边框超出父窗体的边框。)

仍然可以使用一些解决方案,具体取决于目标,希望实现。

一个想法是: 在设计器中创建一个文本框,大小= 100 X 100. 启用自动换行

在文本框的 OnTextChanged 事件处理程序中,我们只是将文本框的宽度调整为一个值,由我们自己定义(例如parentform.Width或其他硬值)。

这会导致自动换行重新计算文本框中的字符串,这会重新排列文本框中的所有字符,因为自动换行已启用。

文本框的高度可以很难设置为parentform.Height,例如。

,但 更好:根据方法texbox.GetPositionFromCharIndex(textbox.TextLength -1)的ReturnValue(Point)的Y值动态设置高度。 然后,使用 Math.Min()确定,它更小(parentform.Height或Point.Y),并将文本框大小重置为新的大小(previousDeterminedWidth,nowDeterminedHeight)。

请记住(如果已启用滚动条),可为您的宽度计算添加约17个像素。

祝你好运

答案 9 :(得分:0)

首先,创建使TextBox适合其内容的方法。

private void AutoSizeTextBox(TextBox txt)
{
    const int x_margin = 0;
    const int y_margin = 2;
    Size size = TextRenderer.MeasureText(txt.Text, txt.Font);
    txt.ClientSize =
        new Size(size.Width + x_margin, size.Height + y_margin);
}

然后使用 TextChanged 事件处理程序调用 AutoSizeTextBox()函数,以使TextBox在文本更改时适合其文本。

private void txtContents_TextChanged(object sender, EventArgs e)
{
    AutoSizeTextBox(sender as TextBox);
}

仅此而已,有关更多信息:

resize-a-textbox-to-fit-its-text