改变文本框的高度?

68

如何改变文本框的高度?

以下两种方法都不起作用:

this.TextBox1.Size = new System.Drawing.Size(173, 100);
或者
this.TextBox1.Size.Height = 100;

我希望能够调整单行文本框的高度以适应其字体大小,如果可能的话,不使用多行文本框。

21个回答

90

进入yourForm.Designer.cs文件 向下滚动到您的文本框。以下示例是textBox2对象。 添加此内容

this.textBox2.AutoSize = false;

并将其大小设置为您想要的任何大小

this.textBox2.Size = new System.Drawing.Size(142, 27);

即使不将multiline设置为true,此方法也会像魔法一样运行得很好,但只有在您更改设计师本身的任何选项之前(您将不得不再次设置这两行)。 我认为,这种方法仍然比多行方法更好。我在我的应用程序中有一个昵称文本框,使用多行时,人们有时会意外地写下他们的名字两次,就像Thomas\nThomas(在实际的文本框行中只看到一个)。使用这个解决方案,文本在每个字符过长以后会简单地向左隐藏,因此对于用户来说更加安全,可以输入。


6
不行,因为A/ 如果文本框被停靠,它就无法工作。B/ 正如指出的那样,在设计器中更改会破坏修复程序。 - smirkingman
5
手动更改设计师文件通常不是解决问题的好方法,几乎总会在以后被覆盖。 - Tom Bogle
3
我可以确认Adam的回答和Franck的评论,AutoSize确实在智能感知中是隐藏的。如果你完整地输入它,它将被识别为有效代码。尝试一下,然后在下划线下按Ctrl并单击AutoSize,你会看到TextBoxBase中的公共覆盖方法(来自元数据)。 - Rafael Ventura

83

有两种方法可以做到这一点:

  • 将文本框的“多行”属性设置为true,但在这种情况下您不想这样做;
  • 将文本框的字体大小设置为更大

我相信这是唯一的方法;更大的字体大小应该会自动适应文本框。


19
为什么这被标记为正确答案?Adam的回答是将AutoSize设置为false,然后设置尺寸是正确的答案。 - sǝɯɐſ

29
你可以设置文本框的 MinimumSize 和/或 MaximumSize 属性。这不会立即影响大小,但当你在窗体设计器中调整文本框的大小时,大小将自动调整以满足最小/最大大小约束。即使将 Multiline 设置为 false ,也可以使用此功能,并且不依赖于字体大小。

我发现了这个方法的一个小问题 - 当它被放置在容器中,比如TableLayoutPanel的单元格中,并且你给它一个左右锚定时,它不能正确地垂直居中。它的垂直位置似乎是按照它的正常大小计算的。 - p0lar_bear
@p0lar_bear:你可以将文本框放在一个大小合适的面板上,然后将该面板放置在TableLayoutPanel单元格中作为解决方法。 - Olivier Jacot-Descombes
@OlivierJacot-Descombes:对的。尽管如此,我的观点是,如果你要做一些可能会弄乱的事情,那么将其变成一个多行文本框并抑制回车键可能更容易管理,就像本页面其他地方建议的那样(虽然我知道这不是OP所寻找的 - 这对我有效)。 - p0lar_bear
另一个解决方法是调整文本框的Margin属性或容器控件的Padding属性。 - Olivier Jacot-Descombes

9

我发现一个设置文本框自定义高度的小技巧。

在设计视图中,将minimumSize设置为您想要的大小,然后完全删除size设置。这将导致设计师使用新的最小设置进行更新!


在设计器中短暂地工作,但一旦保存,它就会回到先前的高度。 - Tom Bogle
真糟糕!这可能是他们修复的一个漏洞。不过,如果你想要一个更大的文本框,只需改变文本大小即可。 - Johnathan Brown

8

设置最小尺寸属性

tb_01.MinimumSize = new Size(500, 300);

这对我有用。

4
public partial class MyTextBox : TextBox
{
    [DefaultValue(false)]
    [Browsable(true)]
    public override bool AutoSize
    {
        get
        {
            return base.AutoSize;
        }
        set
        {
            base.AutoSize = value;
        }
    }

    public MyTextBox()
    {
        InitializeComponent();
        this.AutoSize = false;
    }
}

寻找答案的人,将AutoSize设置为false是关键。如果不想创建新控件,可以在代码中完成。不过,你需要在代码中设置高度。 - Brad Bruce

3
尝试以下方法 :)
        textBox1.Multiline = true;
        textBox1.Height = 100;
        textBox1.Width = 173;

3

步骤:

  1. 将文本框设置为多行
  2. 更改高度
  3. 更改字体大小(以适应大型文本框)
  4. 将文本框重新设置为非多行

这个很好用,即使你不改变字体大小,只要在将多行设置为false之前将“size”值复制到“minimumSize”,就可以了。 - Jonathan

1
你可以将它放在一个与所需高度相同的面板内。这种方式的优点是文本框可以水平居中,而其他解决方案无法提供此功能。
你可以通过使用以下方法使其更加自然。
    private void textBox1_Enter(object sender, EventArgs e)
    {

        panelTextBox.BorderStyle = BorderStyle.FixedSingle;
    }

    private void textBox1_Leave(object sender, EventArgs e)
    {
        panelTextBox.BorderStyle = BorderStyle.None;
    }

1

AutoSize、Minimum和Maximum不够灵活。使用多行文本框并处理回车键事件,抑制keypress。效果很好。

textBox1.Multiline = true;

 private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                e.Handled = true;
                e.SuppressKeyPress = true;
            }
        }

1
如果用户输入太多文本,文本仍将自动换行,因此覆盖回车键是不够的。无论有多少人将其作为正确解决方案发布,将Multiline设置为true绝对不是这个问题的答案。(如果您实际上需要一个多行文本框,那么它是一个很好的解决方案。) - Tom Bogle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接