C# 展开和折叠winform

C# 展开和折叠winform,c#,winforms,C#,Winforms,我试图做的是扩展和折叠winform的中间部分。我知道这里也有类似的问题,但没有一个能真正满足我的需要。我读过关于使用FlowLayoutPanel的文章,但我无法让它工作 我想要实现的一个例子是: 我有我的winform(示例) 当我点击 ButoNo1/时,应将文本框隐藏在中间,缩小窗体以隐藏空间,反之,单击“代码>按钮2 ”。无论哪种方式,按钮3都应保留在文本框显示或未显示的下方 到目前为止,我的尝试要么只是隐藏文本框,对表单不做任何处理,要么缩小了很多。我目前一直在将AutoSize设

我试图做的是扩展和折叠winform的中间部分。我知道这里也有类似的问题,但没有一个能真正满足我的需要。我读过关于使用
FlowLayoutPanel
的文章,但我无法让它工作

我想要实现的一个例子是:

我有我的winform(示例)

当我点击<代码> ButoNo1/<代码>时,应将文本框隐藏在中间,缩小窗体以隐藏空间,反之,单击“代码>按钮2 ”。无论哪种方式,

按钮3
都应保留在文本框显示或未显示的下方

到目前为止,我的尝试要么只是隐藏文本框,对表单不做任何处理,要么缩小了很多。我目前一直在将
AutoSize
设置为
true
AutoSizeMode
设置为
growtandshrink

我见过可以这样做或类似的控件,但它们有箭头或小按钮来扩展表单,我只需要按钮就可以了

有没有一个简单的方法可以做到这一点

谢谢你的帮助

更新

我曾尝试将高度设置为0,并按照建议隐藏文本框,但它只是折叠表单的右侧,而不是中间


隐藏控件并相应地设置Height属性。

这必须使用面板和停靠来完成。使用“自动调整大小”是错误的做法。

您需要将表单的原始高度存储在一个变量中,以便以后再次展开表单时可以将其还原。此外,如果将Button3锚定到底部,则在调整大小期间不必处理它:

public partial class Form1 : Form {
  private int originalHeight;

  public Form1() {
    InitializeComponent();
    button3.Anchor = AnchorStyles.Left | AnchorStyles.Bottom;
  }

  protected override void OnLoad(EventArgs e) {
    originalHeight = this.Height;
    base.OnLoad(e);
  }

  private void button1_Click(object sender, EventArgs e) {
    textBox1.Visible = false;
    this.Height = originalHeight - textBox1.Height;
  }

  private void button2_Click(object sender, EventArgs e) {
    this.Height = originalHeight;
    textBox1.Visible = true;
  }
}
保留
AutoSize=false在表单上,因为您正在自己调整大小


我会考虑使用一个按钮来处理窗体的切换,因为Butn2在窗体展开时是相当无用的,反之亦然,如果窗体崩溃,Butn1就没用了。

我知道,我迟到了,但是因为我刚刚解决了同一个问题,所以我想给你我的解决方案:

正如您已经提到的,您可以使用
FlowLayoutPanel
来完成这项工作。把它放到你的表格里。将FlowDirection设置为自上而下,并按正确顺序添加按钮和文本框。 完成后,将表单和FlowLayoutPanel的
AutoSize
设置为true,并将
AutoSizeMode
设置为
GrowtandShrink

防止打开自动调整大小时宽度折叠

您的问题是,如果您将AutoSize设置为true并禁用/隐藏文本框,则宽度将减小。之所以会出现这种情况,是因为文本框是窗体上最宽的控件,如果它是隐藏的,则宽度将减小到其余控件所需的宽度。为了防止这种情况发生,只需将按钮放入与文本框宽度相同的面板控件中。 现在,如果文本框被隐藏,宽度将保持为所需的宽度

使用复选框展开/折叠

我喜欢使用复选框来展开/折叠,而不是使用两个按钮。调整大小的整个编码将减少为在文本框的
可见性
属性中添加一个
复选框1的绑定行。选中的
属性:

textbox1.DataBindings.Add(“可见”,复选框1,“选中”)


是否将“高度”属性设置为0并将其隐藏?使用已知的高度从放置第三个按钮的y坐标中减去,并从表单y大小中减去文本框的高度,以相应地缩小。当你想展示itI的时候,把它们加回去。我最近写了类似的东西,在网上已经找到了几个例子。看看或举个例子。还有很多第三方控件可以做到这一点;DevExpress有一个可折叠的面板控件。您可以从按钮模拟面板标题的单击事件(而不显示面板标题!),这太棒了正是我想要的。我会按照你的建议切换1个按钮,这会更好,非常感谢!虽然这种方法有效,但我相信这是一种实现你想要的东西的可怕方式。布局上的任何更改都需要大量的代码更改,并引入其他无用的变量。(不是说这不是你问题的答案:这是……这只是一种非常糟糕的做法)